Extra commit for files in 'common'
- Add functionality to add a default dictionary for configuration fields - Correct entitlement processing - Remove get_template functionality from ModelVariables, define it directly with LLM model definition in configuration file.
This commit is contained in:
@@ -24,45 +24,65 @@ class LicensePeriodServices:
|
||||
Raises:
|
||||
EveAIException: and derived classes
|
||||
"""
|
||||
current_date = dt.now(tz.utc).date()
|
||||
license_period = (db.session.query(LicensePeriod)
|
||||
.filter_by(tenant_id=tenant_id)
|
||||
.filter(and_(LicensePeriod.period_start_date <= current_date,
|
||||
LicensePeriod.period_end_date >= current_date))
|
||||
.first())
|
||||
if not license_period:
|
||||
license_period = LicensePeriodServices._create_next_license_period_for_usage(tenant_id)
|
||||
if license_period:
|
||||
match license_period.status:
|
||||
case PeriodStatus.UPCOMING:
|
||||
LicensePeriodServices._complete_last_license_period()
|
||||
LicensePeriodServices._activate_license_period(license_period)
|
||||
if not license_period.license_usage:
|
||||
new_license_usage = LicenseUsage()
|
||||
new_license_usage.license_period = license_period
|
||||
try:
|
||||
db.session.add(new_license_usage)
|
||||
db.session.commit()
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
current_app.logger.error(
|
||||
f"Error creating new license usage for license period {license_period.id}: {str(e)}")
|
||||
raise e
|
||||
if license_period.status == PeriodStatus.ACTIVE:
|
||||
try:
|
||||
current_app.logger.debug(f"Finding current license period for tenant {tenant_id}")
|
||||
current_date = dt.now(tz.utc).date()
|
||||
license_period = (db.session.query(LicensePeriod)
|
||||
.filter_by(tenant_id=tenant_id)
|
||||
.filter(and_(LicensePeriod.period_start <= current_date,
|
||||
LicensePeriod.period_end >= current_date))
|
||||
.first())
|
||||
current_app.logger.debug(f"End searching for license period for tenant {tenant_id} ")
|
||||
if not license_period:
|
||||
current_app.logger.debug(f"No license period found for tenant {tenant_id} on date {current_date}")
|
||||
license_period = LicensePeriodServices._create_next_license_period_for_usage(tenant_id)
|
||||
current_app.logger.debug(f"Created license period {license_period.id} for tenant {tenant_id}")
|
||||
if license_period:
|
||||
current_app.logger.debug(f"Found license period {license_period.id} for tenant {tenant_id} "
|
||||
f"with status {license_period.status}")
|
||||
match license_period.status:
|
||||
case PeriodStatus.UPCOMING:
|
||||
current_app.logger.debug(f"In upcoming state")
|
||||
LicensePeriodServices._complete_last_license_period(tenant_id=tenant_id)
|
||||
current_app.logger.debug(f"Completed last license period for tenant {tenant_id}")
|
||||
LicensePeriodServices._activate_license_period(license_period=license_period)
|
||||
current_app.logger.debug(f"Activated license period {license_period.id} for tenant {tenant_id}")
|
||||
if not license_period.license_usage:
|
||||
new_license_usage = LicenseUsage(
|
||||
tenant_id=tenant_id,
|
||||
)
|
||||
new_license_usage.license_period = license_period
|
||||
try:
|
||||
db.session.add(new_license_usage)
|
||||
db.session.commit()
|
||||
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
current_app.logger.error(
|
||||
f"Error creating new license usage for license period "
|
||||
f"{license_period.id}: {str(e)}")
|
||||
raise e
|
||||
if license_period.status == PeriodStatus.ACTIVE:
|
||||
return license_period
|
||||
else:
|
||||
# Status is PENDING, so no prepaid payment received. There is no license period we can use.
|
||||
# We allow for a delay of 5 days before raising an exception.
|
||||
current_date = dt.now(tz.utc).date()
|
||||
delta = abs(current_date - license_period.period_start_date)
|
||||
if delta > timedelta(days=current_app.config.get('ENTITLEMENTS_MAX_PENDING_DAYS', 5)):
|
||||
raise EveAIPendingLicensePeriod()
|
||||
case PeriodStatus.ACTIVE:
|
||||
return license_period
|
||||
else:
|
||||
# Status is PENDING, so no prepaid payment received. There is no license period we can use.
|
||||
# We allow for a delay of 5 days before raising an exception.
|
||||
current_date = dt.now(tz.utc).date()
|
||||
delta = abs(current_date - license_period.period_start_date)
|
||||
if delta > timedelta(days=current_app.config.get('ENTITLEMENTS_MAX_PENDING_DAYS', 5)):
|
||||
raise EveAIPendingLicensePeriod()
|
||||
case PeriodStatus.ACTIVE:
|
||||
return license_period
|
||||
case PeriodStatus.PENDING:
|
||||
return license_period
|
||||
else:
|
||||
raise EveAILicensePeriodsExceeded(license_id=None)
|
||||
case PeriodStatus.PENDING:
|
||||
return license_period
|
||||
else:
|
||||
raise EveAILicensePeriodsExceeded(license_id=None)
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
current_app.logger.error(f"Error finding current license period for tenant {tenant_id}: {str(e)}")
|
||||
raise e
|
||||
except Exception as e:
|
||||
raise e
|
||||
|
||||
@staticmethod
|
||||
def _create_next_license_period_for_usage(tenant_id) -> LicensePeriod:
|
||||
@@ -87,13 +107,17 @@ class LicensePeriodServices:
|
||||
if not the_license:
|
||||
current_app.logger.error(f"No active license found for tenant {tenant_id} on date {current_date}")
|
||||
raise EveAINoActiveLicense(tenant_id=tenant_id)
|
||||
else:
|
||||
current_app.logger.debug(f"Found active license {the_license.id} for tenant {tenant_id} "
|
||||
f"on date {current_date}")
|
||||
|
||||
next_period_number = 1
|
||||
if the_license.periods:
|
||||
# If there are existing periods, get the next sequential number
|
||||
next_period_number = max(p.period_number for p in the_license.periods) + 1
|
||||
current_app.logger.debug(f"Next period number for tenant {tenant_id} is {next_period_number}")
|
||||
|
||||
if next_period_number > the_license.max_periods:
|
||||
if next_period_number > the_license.nr_of_periods:
|
||||
raise EveAILicensePeriodsExceeded(license_id=the_license.id)
|
||||
|
||||
new_license_period = LicensePeriod(
|
||||
@@ -103,18 +127,16 @@ class LicensePeriodServices:
|
||||
period_start=the_license.start_date + relativedelta(months=next_period_number-1),
|
||||
period_end=the_license.end_date + relativedelta(months=next_period_number, days=-1),
|
||||
status=PeriodStatus.UPCOMING,
|
||||
upcoming_at=dt.now(tz.utc),
|
||||
)
|
||||
set_logging_information(new_license_period, dt.now(tz.utc))
|
||||
new_license_usage = LicenseUsage(
|
||||
license_period=new_license_period,
|
||||
tenant_id=tenant_id,
|
||||
)
|
||||
set_logging_information(new_license_usage, dt.now(tz.utc))
|
||||
|
||||
try:
|
||||
current_app.logger.debug(f"Creating next license period for tenant {tenant_id} ")
|
||||
db.session.add(new_license_period)
|
||||
db.session.add(new_license_usage)
|
||||
db.session.commit()
|
||||
current_app.logger.info(f"Created next license period for tenant {tenant_id} "
|
||||
f"with id {new_license_period.id}")
|
||||
return new_license_period
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
@@ -136,15 +158,17 @@ class LicensePeriodServices:
|
||||
Raises:
|
||||
ValueError: If neither license_period_id nor license_period is provided
|
||||
"""
|
||||
current_app.logger.debug(f"Activating license period")
|
||||
if license_period is None and license_period_id is None:
|
||||
raise ValueError("Either license_period_id or license_period must be provided")
|
||||
|
||||
# Get a license period object if only ID was provided
|
||||
if license_period is None:
|
||||
current_app.logger.debug(f"Getting license period {license_period_id} to activate")
|
||||
license_period = LicensePeriod.query.get_or_404(license_period_id)
|
||||
|
||||
if license_period.upcoming_at is not None:
|
||||
license_period.pending_at.upcoming_at = dt.now(tz.utc)
|
||||
if license_period.pending_at is not None:
|
||||
license_period.pending_at = dt.now(tz.utc)
|
||||
license_period.status = PeriodStatus.PENDING
|
||||
if license_period.prepaid_payment:
|
||||
# There is a payment received for the given period
|
||||
@@ -173,7 +197,7 @@ class LicensePeriodServices:
|
||||
if not license_period.license_usage:
|
||||
license_period.license_usage = LicenseUsage(
|
||||
tenant_id=license_period.tenant_id,
|
||||
license_period=license_period,
|
||||
license_period_id=license_period.id,
|
||||
)
|
||||
|
||||
license_period.license_usage.recalculate_storage()
|
||||
|
||||
Reference in New Issue
Block a user