Skip to content

Commit

Permalink
Changes to the logic of calculating expiration date (data-dot-all#1635)
Browse files Browse the repository at this point in the history
### Feature or Bugfix
- Feature 

### Detail

Changes to the logic of calculating expiration. 

Initially current month was considered into the calculation for
expiration date. But this resulted in a bug while performing unit tests
here data-dot-all#1594 and also this was
not correct in the sense that if a user requests a month of expiration
at the end of month, that user will get expiration at the end of the
same month

But with the new logic -
data-dot-all#1594, more than half a
month is granted extra .

**To minimize this extra access period on share, this PR proposes new
logic,**

1. If the user is in the last week of the month and if the user requests
1 month of data, allocate the end of the next month.
2. If the user is in NOT in the last week of the months and if the user
requests 1 month of data, allocate the end of same month as expiration.

### Relates
- data-dot-all#1083

### Security
Please answer the questions below briefly where applicable, or write
`N/A`. Based on
[OWASP 10](https://owasp.org/Top10/en/).

- Does this PR introduce or modify any input fields or queries - this
includes
fetching data from storage outside the application (e.g. a database, an
S3 bucket)?
  - Is the input sanitized?
- What precautions are you taking before deserializing the data you
consume?
  - Is injection prevented by parametrizing queries?
  - Have you ensured no `eval` or similar functions are used?
- Does this PR introduce any functionality or component that requires
authorization?
- How have you ensured it respects the existing AuthN/AuthZ mechanisms?
  - Are you logging failed auth attempts?
- Are you using or adding any cryptographic features?
  - Do you use a standard proven implementations?
  - Are the used keys controlled by the customer? Where are they stored?
- Are you introducing any new policies/roles/users?
  - Have you used the least-privilege principle? How?


By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

---------

Co-authored-by: trajopadhye <[email protected]>
  • Loading branch information
TejasRGitHub and trajopadhye authored Oct 17, 2024
1 parent 18d375b commit 5a5953c
Showing 1 changed file with 25 additions and 13 deletions.
38 changes: 25 additions & 13 deletions backend/dataall/base/utils/expiration_util.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import calendar
from datetime import date, datetime
from datetime import date, datetime, timedelta
from dateutil.relativedelta import relativedelta
from dataall.base.api import GraphQLEnumMapper

Expand All @@ -8,29 +8,41 @@ class ExpirationUtils:
@staticmethod
def calculate_expiry_date(expirationPeriod, expirySetting):
currentDate = date.today()
last_week_start_date, last_week_end_date = ExpirationUtils.get_last_week_date_range(
currentDate.year, currentDate.month
)
if expirySetting == Expiration.Quartely.value:
if currentDate < datetime(currentDate.year, currentDate.month, 15).date():
# First half of the month - extend 2.X months
quarterlyCalculatedDate = currentDate + relativedelta(months=expirationPeriod * 3 - 1)
else:
# Second half of the month - extend 3.X months
if last_week_start_date <= currentDate <= last_week_end_date:
# If in the last week of the month extend x3 months
quarterlyCalculatedDate = currentDate + relativedelta(months=expirationPeriod * 3)
day = calendar.monthrange(quarterlyCalculatedDate.year, quarterlyCalculatedDate.month)[1]
shareExpiryDate = datetime(quarterlyCalculatedDate.year, quarterlyCalculatedDate.month, day)
elif expirySetting == Expiration.Monthly.value:
if currentDate < datetime(currentDate.year, currentDate.month, 15).date():
# First half of the month - extend until end of month
monthlyCalculatedDate = currentDate + relativedelta(months=expirationPeriod - 1)
else:
# Second half of the month - extend until end of next month
# If the user is not in the last week, consider this month into the calculation
quarterlyCalculatedDate = currentDate + relativedelta(months=expirationPeriod * 3 - 1)
monthEndDay = calendar.monthrange(quarterlyCalculatedDate.year, quarterlyCalculatedDate.month)[1]
shareExpiryDate = datetime(quarterlyCalculatedDate.year, quarterlyCalculatedDate.month, monthEndDay)
elif expirySetting == Expiration.Monthly.value:
if last_week_start_date <= currentDate <= last_week_end_date:
# If in the last week of the month extend "expirationPeriod" number of months
monthlyCalculatedDate = currentDate + relativedelta(months=expirationPeriod)
else:
# If the user is not in the last week, consider this month into the calculation - extend for "expirationPeriod" - 1
monthlyCalculatedDate = currentDate + relativedelta(months=expirationPeriod - 1)
monthEndDay = calendar.monthrange(monthlyCalculatedDate.year, monthlyCalculatedDate.month)[1]
shareExpiryDate = datetime(monthlyCalculatedDate.year, monthlyCalculatedDate.month, monthEndDay)
else:
shareExpiryDate = None

return shareExpiryDate

@staticmethod
def get_last_week_date_range(year, month):
last_day_of_month = calendar.monthrange(year, month)[1]
last_date = date(year, month, last_day_of_month)
last_week_day = last_date.weekday()
start_date = last_date - timedelta(days=last_week_day)

return start_date, last_date


# Enums used for dataset expiration.
# Could be repurposed for environment, worksheet, etc if need be
Expand Down

0 comments on commit 5a5953c

Please sign in to comment.