2021-12-09 16:53:44 +01:00
|
|
|
"""Ensemble des classes d'utilité publique :-)"""
|
|
|
|
|
|
|
|
from django.db import models
|
2022-01-03 10:01:50 +01:00
|
|
|
from django.utils import timezone
|
2021-12-09 16:53:44 +01:00
|
|
|
|
2022-09-27 08:24:01 +02:00
|
|
|
from datetime import date
|
2021-12-09 16:53:44 +01:00
|
|
|
import markdown
|
2022-10-06 13:44:49 +02:00
|
|
|
from .date_week_transition import get_number_of_weeks_between
|
2021-12-09 16:53:44 +01:00
|
|
|
|
|
|
|
class TemporizableQuerySet(models.QuerySet):
|
|
|
|
"""
|
2021-12-19 09:30:51 +01:00
|
|
|
Classe permettant de spécifier le `QuerySet` de la classe `Temporizable`.
|
|
|
|
"""
|
2021-12-09 16:53:44 +01:00
|
|
|
|
|
|
|
def next(self, limit):
|
|
|
|
"""
|
2021-12-19 09:30:51 +01:00
|
|
|
Renvoie la liste des prochains "temporizable" (par rapport à la date du jour).
|
2021-12-09 16:53:44 +01:00
|
|
|
|
2021-12-19 09:30:51 +01:00
|
|
|
:param limit: nombre d'éléments désirés.
|
|
|
|
:type limit: int
|
|
|
|
:return: une liste de `limit` éléments temporizables.
|
|
|
|
"""
|
2022-09-23 16:02:20 +02:00
|
|
|
return self.filter(date_begin__gte=timezone.now()).order_by("date_begin")[0:limit]
|
2021-12-09 16:53:44 +01:00
|
|
|
|
|
|
|
def last(self, limit):
|
|
|
|
"""
|
2021-12-19 09:30:51 +01:00
|
|
|
Renvoie la liste des derniers "temporizable" (par rapport à la date du jour).
|
2021-12-09 16:53:44 +01:00
|
|
|
|
2021-12-19 09:30:51 +01:00
|
|
|
:param limit: nombre d'éléments désirés.
|
|
|
|
:type limit: int
|
|
|
|
:return: une liste de `limit` éléments temporizables
|
|
|
|
"""
|
2022-09-23 16:02:20 +02:00
|
|
|
return self.filter(date_end__lte=timezone.now()).order_by("-date_end")[0:limit]
|
2021-12-09 16:53:44 +01:00
|
|
|
|
|
|
|
# def get(self, date_string):
|
|
|
|
# """
|
|
|
|
# """
|
|
|
|
# try:
|
2022-09-23 16:02:20 +02:00
|
|
|
# selected_object = self.get(date_begin__lte=date_string, date_end__gte=date_string)
|
2021-12-09 16:53:44 +01:00
|
|
|
# except self.DoesNotExist:
|
|
|
|
# return None
|
|
|
|
# except self.MultipleObjectsReturned:
|
|
|
|
# return None
|
|
|
|
|
|
|
|
# return selected_object
|
|
|
|
|
|
|
|
|
|
|
|
class Temporizable(models.Model):
|
|
|
|
"""
|
|
|
|
Classe abstraite définissant une période comprise entre deux dates.
|
2021-12-19 09:30:51 +01:00
|
|
|
"""
|
2021-12-09 16:53:44 +01:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
abstract = True
|
|
|
|
|
2022-10-06 14:52:28 +02:00
|
|
|
date_begin = models.DateTimeField(verbose_name="Begin", default=timezone.now)
|
|
|
|
date_end = models.DateTimeField(verbose_name="End", default=timezone.now)
|
2021-12-09 16:53:44 +01:00
|
|
|
|
|
|
|
objects = models.Manager.from_queryset(TemporizableQuerySet)()
|
|
|
|
|
|
|
|
def get_total_occurence(self):
|
|
|
|
"""
|
2021-12-19 09:30:51 +01:00
|
|
|
Renvoie le nombre de semaines entre les deux dates d'une instance de la
|
|
|
|
classe `Temporizable`.
|
2021-12-09 16:53:44 +01:00
|
|
|
|
2021-12-19 09:30:51 +01:00
|
|
|
:return: nombre de semaines.
|
|
|
|
"""
|
2022-09-23 16:02:20 +02:00
|
|
|
return get_number_of_weeks_between(self.date_begin.date(), self.date_end.date())
|
2021-12-09 16:53:44 +01:00
|
|
|
|
|
|
|
def get_number_of_occurence_to_event(self, the_date):
|
|
|
|
"""
|
2021-12-19 09:30:51 +01:00
|
|
|
Renvoie le nombre semaines entre une date choisie et le début
|
2022-09-23 16:02:20 +02:00
|
|
|
(date_begin) d'une instance de la classe `Temporizable`.
|
2021-12-09 16:53:44 +01:00
|
|
|
|
2021-12-19 09:30:51 +01:00
|
|
|
:param the_date: date par rapport à laquelle le calcul sera fait.
|
|
|
|
:type the_date: datetime.date
|
|
|
|
:return: nombre de semaines.
|
|
|
|
"""
|
2022-09-23 16:02:20 +02:00
|
|
|
return get_number_of_weeks_between(the_date, self.date_begin.date())
|
2021-12-09 16:53:44 +01:00
|
|
|
|
|
|
|
def get_number_of_occurence_inbetween(self, the_date, rest=True):
|
|
|
|
"""
|
2021-12-19 09:30:51 +01:00
|
|
|
Renvoie le nombre semaines entre une date choisie et une instance de la
|
|
|
|
classe `Temporizable`. Le calcul peut se faire soit entre la date
|
|
|
|
choisie et le date de fin d'une occurence de la classe, soit entre la
|
|
|
|
date de début d'une occurence de la classe et la date choisie.
|
|
|
|
|
|
|
|
:param the_date: date par rapport à laquelle le calcul sera fait.
|
|
|
|
:type the_date: datetime.date
|
|
|
|
:param rest: paramètre définissant s'il faut calculer le reste des
|
|
|
|
occurences à venir (depuis `the_date` jusqu'à la date de fin) ou
|
|
|
|
les occurences déjà passées (depuis la date de début jusqu'à
|
|
|
|
`the_date`)
|
|
|
|
:type rest: booléen
|
|
|
|
:return: nombre de semaines.
|
|
|
|
"""
|
2021-12-09 16:53:44 +01:00
|
|
|
if rest:
|
2022-09-23 16:02:20 +02:00
|
|
|
return get_number_of_weeks_between(the_date, self.date_end.date())
|
2022-01-07 18:08:39 +01:00
|
|
|
|
2022-09-23 16:02:20 +02:00
|
|
|
return get_number_of_weeks_between(self.date_begin.date(), the_date)
|
2021-12-09 16:53:44 +01:00
|
|
|
|
|
|
|
|
|
|
|
class Markdownizable(models.Model):
|
|
|
|
"""
|
|
|
|
Classe abstraite ajoutant un champ `informations`, convertible de .md -> .html.
|
|
|
|
"""
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
abstract = True
|
|
|
|
|
|
|
|
informations = models.TextField(
|
|
|
|
null=True,
|
|
|
|
blank=True,
|
2021-12-19 09:30:51 +01:00
|
|
|
verbose_name="Comments",
|
|
|
|
help_text="Only MarkDown is authorized",
|
2021-12-09 16:53:44 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
def to_markdown(self):
|
|
|
|
"""Convertit le champ `informations` en (Github-flavored) Markdown."""
|
|
|
|
|
|
|
|
return markdown.markdown(self.informations)
|