From 471e179d2485e0c9a924edacdea9dd5662963404 Mon Sep 17 00:00:00 2001 From: Julien Constant Date: Wed, 6 Sep 2023 19:43:49 +0200 Subject: [PATCH] Fix tests & the method again --- core/utils.py | 46 +++++++++++++++++++++++------------------- counter/tests.py | 26 ++++++++++++++++++++++++ counter/views.py | 2 +- sith/settings.py | 3 ++- subscription/models.py | 12 +++++------ 5 files changed, 60 insertions(+), 29 deletions(-) diff --git a/core/utils.py b/core/utils.py index be6531be..d61454b3 100644 --- a/core/utils.py +++ b/core/utils.py @@ -43,32 +43,36 @@ def get_git_revision_short_hash() -> str: except subprocess.CalledProcessError: return "" - -def get_start_of_semester(today=date.today()): +def get_start_of_semester(today=date.today()) -> date: """ - This function computes the start date of the semester with respect to the given date (default is today), - and the start date given in settings.SITH_START_DATE. - It takes the nearest past start date. - Exemples: with SITH_START_DATE = (8, 15) - Today -> Start date - 2015-03-17 -> 2015-02-15 - 2015-01-11 -> 2014-08-15 + Determine in which semester the given date is and return the start date of + the corresponding semester + + Args: + today (date, optional): The date to test. Defaults to date.today(). + + Returns: + date: The start date of the semester where the given date belongs + + Context: + - if the date is between 15/08 and 31/12 -> autumn semester + - if the date is between 01/01 and 15/02 -> autumn semester where the year is the one before of the given date + - else between 15/02 and 15/08 -> spring semester """ - year = today.year + autumn_month, autumn_day = settings.SITH_SEMESTER_START_AUTUMN + spring_month, spring_day = settings.SITH_SEMESTER_START_SPRING - # Get the start date of the autumn semester based on settings.SITH_START_DATE - autumn_start = date(year, settings.SITH_START_DATE[0], settings.SITH_START_DATE[1]) - # Get the start date of the spring semester, 6 months from autumn_start - spring_start = autumn_start.replace(month=(autumn_start.month + 6) % 12) + if today > date(today.year, autumn_month, autumn_day) and today < date( + today.year + 1, 1, 1 + ): + return date(today.year, autumn_month, autumn_day) - # Ensure that spring_start represents the earlier semester start date - if autumn_start > spring_start: - spring_start, autumn_start = autumn_start, spring_start + if today >= date(today.year, 1, 1) and today < date( + today.year, spring_month, spring_day + ): + return date(today.year - 1, autumn_month, autumn_day) - # Determine the appropriate semester start date based on the current date - # If today is earlier than spring_start, return the autumn semester start date of the previous year - # Otherwise, return the spring semester start date of the current year - return autumn_start.replace(year=year - 1) if today < spring_start else spring_start + return date(today.year, spring_month, spring_day) def get_semester(d=date.today()): diff --git a/counter/tests.py b/counter/tests.py index ed83e935..dc0f41e7 100644 --- a/counter/tests.py +++ b/counter/tests.py @@ -13,6 +13,7 @@ # OR WITHIN THE LOCAL FILE "LICENSE" # # +from datetime import date, timedelta import json import re import string @@ -25,7 +26,9 @@ from django.utils.timezone import timedelta from club.models import Club from core.models import User +from core.utils import get_start_of_semester from counter.models import Counter, Customer, BillingInfo, Permanency, Selling, Product +from django.conf import settings from sith.settings import SITH_MAIN_CLUB @@ -260,6 +263,29 @@ class CounterStatsTest(TestCase): s.customer = root_customer s.save(allow_negative=True) + def test_get_start_of_semester(self): + autumn_month, autumn_day = settings.SITH_SEMESTER_START_AUTUMN + spring_month, spring_day = settings.SITH_SEMESTER_START_SPRING + + t1_autumn_day = date(2025, 1, 1) + t2_autumn_day = date(2024, 9, 1) + + t1_spring_day = date(2023, 3, 1) + t2_spring_day = date(2023, spring_month, spring_day) + + self.assertTrue( + get_start_of_semester(t1_autumn_day) == date(2024, autumn_month, autumn_day) + ) + self.assertTrue( + get_start_of_semester(t2_autumn_day) == date(2024, autumn_month, autumn_day) + ) + self.assertTrue( + get_start_of_semester(t1_spring_day) == date(2023, spring_month, spring_day) + ) + self.assertTrue( + get_start_of_semester(t2_spring_day) == date(2023, spring_month, spring_day) + ) + def test_not_authenticated_user_fail(self): # Test with not login user response = self.client.get(reverse("counter:stats", args=[self.counter.id])) diff --git a/counter/views.py b/counter/views.py index 4d5af292..483e13f5 100644 --- a/counter/views.py +++ b/counter/views.py @@ -1354,7 +1354,7 @@ class CounterStatView(DetailView, CounterAdminMixin): def get_context_data(self, **kwargs): """Add stats to the context""" - counter = self.object + counter: Counter = self.object semester_start = get_start_of_semester() office_hours = counter.get_top_barmen() kwargs = super(CounterStatView, self).get_context_data(**kwargs) diff --git a/sith/settings.py b/sith/settings.py index 26a013a0..5ed279af 100644 --- a/sith/settings.py +++ b/sith/settings.py @@ -327,7 +327,8 @@ SITH_CLUB_ROOT_PAGE = "clubs" # Define the date in the year serving as reference for the subscriptions calendar # (month, day) -SITH_START_DATE = (8, 15) # 15th August +SITH_SEMESTER_START_AUTUMN = (8, 15) # 15 August +SITH_SEMESTER_START_SPRING = (2, 15) # 15 February # Used to determine the valid promos SITH_SCHOOL_START_YEAR = 1999 diff --git a/subscription/models.py b/subscription/models.py index ee4334f1..f1c2b2d5 100644 --- a/subscription/models.py +++ b/subscription/models.py @@ -114,12 +114,12 @@ class Subscription(models.Model): return "No user - " + str(self.pk) @staticmethod - def compute_start(d=None, duration=1, user=None): + def compute_start(d: date = None, duration: int = 1, user: User = None) -> date: """ This function computes the start date of the subscription with respect to the given date (default is today), - and the start date given in settings.SITH_START_DATE. + and the start date given in settings.SITH_SEMESTER_START_AUTUMN. It takes the nearest past start date. - Exemples: with SITH_START_DATE = (8, 15) + Exemples: with SITH_SEMESTER_START_AUTUMN = (8, 15) Today -> Start date 2015-03-17 -> 2015-02-15 2015-01-11 -> 2014-08-15 @@ -135,9 +135,9 @@ class Subscription(models.Model): return get_start_of_semester(d) @staticmethod - def compute_end(duration, start=None, user=None): + def compute_end(duration: int, start: date = None, user: User = None) -> date: """ - This function compute the end date of the subscription given a start date and a duration in number of semestre + This function compute the end date of the subscription given a start date and a duration in number of semester Exemple: Start - Duration -> End date 2015-09-18 - 1 -> 2016-03-18 @@ -153,7 +153,7 @@ class Subscription(models.Model): days=math.ceil((6 * duration - round(6 * duration)) * 30), ) - def can_be_edited_by(self, user): + def can_be_edited_by(self, user: User): return user.is_board_member or user.is_root def is_valid_now(self):