Fix tests & the method again

This commit is contained in:
Julien Constant 2023-09-06 19:43:49 +02:00
parent 0aa6ad841b
commit 471e179d24
5 changed files with 60 additions and 29 deletions

View File

@ -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()):

View File

@ -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]))

View File

@ -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)

View File

@ -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

View File

@ -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):