From 3c19fc9d5b51106d01e047304d028e40c5f06a2e Mon Sep 17 00:00:00 2001 From: Oscar Krause Date: Tue, 17 Jan 2023 11:49:56 +0100 Subject: [PATCH] implemented "lease_renewal" attribute as calculated value within what period of time the license must be renewed --- app/main.py | 9 ++++++--- app/orm.py | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/main.py b/app/main.py index 46d8a65..204a55a 100644 --- a/app/main.py +++ b/app/main.py @@ -9,7 +9,7 @@ from dotenv import load_dotenv from fastapi import FastAPI from fastapi.requests import Request from json import loads as json_loads -from datetime import datetime +from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from calendar import timegm from jose import jws, jwk, jwt, JWTError @@ -43,6 +43,7 @@ INSTANCE_KEY_PUB = load_key(str(env('INSTANCE_KEY_PUB', join(dirname(__file__), TOKEN_EXPIRE_DELTA = relativedelta(days=int(env('TOKEN_EXPIRE_DAYS', 1)), hours=int(env('TOKEN_EXPIRE_HOURS', 0))) LEASE_EXPIRE_DELTA = relativedelta(days=int(env('LEASE_EXPIRE_DAYS', 90)), hours=int(env('LEASE_EXPIRE_HOURS', 0))) LEASE_RENEWAL_PERIOD = float(env('LEASE_RENEWAL_PERIOD', 0.15)) +LEASE_RENEWAL_DELTA = timedelta(days=int(env('LEASE_EXPIRE_DAYS', 90)), hours=int(env('LEASE_EXPIRE_HOURS', 0))) CORS_ORIGINS = str(env('CORS_ORIGINS', '')).split(',') if (env('CORS_ORIGINS')) else [f'https://{DLS_URL}'] jwt_encode_key = jwk.construct(INSTANCE_KEY_RSA.export_key().decode('utf-8'), algorithm=ALGORITHMS.RS256) @@ -151,7 +152,8 @@ async def _origins(request: Request, leases: bool = False): for origin in session.query(Origin).all(): x = origin.serialize() if leases: - x['leases'] = list(map(lambda _: _.serialize(), Lease.find_by_origin_ref(db, origin.origin_ref))) + serialize = dict(renewal_period=LEASE_RENEWAL_PERIOD, renewal_delta=LEASE_RENEWAL_DELTA) + x['leases'] = list(map(lambda _: _.serialize(**serialize), Lease.find_by_origin_ref(db, origin.origin_ref))) response.append(x) session.close() return JSONr(response) @@ -168,7 +170,8 @@ async def _leases(request: Request, origin: bool = False): session = sessionmaker(bind=db)() response = [] for lease in session.query(Lease).all(): - x = lease.serialize() + serialize = dict(renewal_period=LEASE_RENEWAL_PERIOD, renewal_delta=LEASE_RENEWAL_DELTA) + x = lease.serialize(**serialize) if origin: lease_origin = session.query(Origin).filter(Origin.origin_ref == lease.origin_ref).first() if lease_origin is not None: diff --git a/app/orm.py b/app/orm.py index aadc0ef..50ff3ce 100644 --- a/app/orm.py +++ b/app/orm.py @@ -81,7 +81,7 @@ class Lease(Base): def __repr__(self): return f'Lease(origin_ref={self.origin_ref}, lease_ref={self.lease_ref}, expires={self.lease_expires})' - def serialize(self) -> dict: + def serialize(self, renewal_period: float, renewal_delta: datetime.timedelta) -> dict: return { 'lease_ref': self.lease_ref, 'origin_ref': self.origin_ref, @@ -89,6 +89,7 @@ class Lease(Base): 'lease_created': self.lease_created.isoformat(), 'lease_expires': self.lease_expires.isoformat(), 'lease_updated': self.lease_updated.isoformat(), + 'lease_renewal': Lease.calculate_renewal(renewal_period, renewal_delta), } @staticmethod @@ -156,6 +157,19 @@ class Lease(Base): session.close() return deletions + @staticmethod + def calculate_renewal(renewal_period: float, delta: datetime.timedelta): + """ + LEASE_RENEWAL_PERIOD=0.2 # 20% + delta = datetime.timedelta(days=1) + renew = delta.total_seconds() * LEASE_RENEWAL_PERIOD + renew = timedelta(seconds=renew) + expires = delta - renew # 19.2 + """ + renew = delta.total_seconds() * renewal_period + renew = datetime.timedelta(seconds=renew) + return delta - renew + def init(engine: Engine): tables = [Origin, Lease]