diff --git a/apps/activity/forms.py b/apps/activity/forms.py index 533ff7d19aead2e988a69f399b30d02f29ea70f7..4a13c2305bc0b0b7e28f9519f53e7d4aeeb46529 100644 --- a/apps/activity/forms.py +++ b/apps/activity/forms.py @@ -1,6 +1,6 @@ # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later -from datetime import timedelta +from datetime import timedelta, datetime from django import forms from django.contrib.contenttypes.models import ContentType @@ -41,6 +41,9 @@ class GuestForm(forms.ModelForm): def clean(self): cleaned_data = super().clean() + if self.activity.date_start > datetime.now(): + self.add_error("inviter", _("You can't invite someone once the activity is started.")) + one_year = timedelta(days=365) qs = Guest.objects.filter( diff --git a/apps/activity/models.py b/apps/activity/models.py index feae60d712ad0c12643bef8f10e58d6ed83c1f97..b17a9f6e341f972a6a86c2ca4ad70e33f877d46f 100644 --- a/apps/activity/models.py +++ b/apps/activity/models.py @@ -1,6 +1,6 @@ # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later -from datetime import timedelta +from datetime import timedelta, datetime from django.contrib.auth.models import User from django.db import models @@ -212,21 +212,25 @@ class Guest(models.Model): def save(self, force_insert=False, force_update=False, using=None, update_fields=None): one_year = timedelta(days=365) - qs = Guest.objects.filter( - first_name=self.first_name, - last_name=self.last_name, - activity__date_start__gte=self.activity.date_start - one_year, - ) - if len(qs) >= 5: - raise ValidationError(_("This person has been already invited 5 times this year.")) - - qs = qs.filter(activity=self.activity) - if qs.exists(): - raise ValidationError(_("This person is already invited.")) - - qs = Guest.objects.filter(inviter=self.inviter, activity=self.activity) - if len(qs) >= 3: - raise ValidationError(_("You can't invite more than 3 people to this activity.")) + if not force_insert: + if self.activity.date_start > datetime.now(): + raise ValidationError(_("You can't invite someone once the activity is started.")) + + qs = Guest.objects.filter( + first_name=self.first_name, + last_name=self.last_name, + activity__date_start__gte=self.activity.date_start - one_year, + ) + if len(qs) >= 5: + raise ValidationError(_("This person has been already invited 5 times this year.")) + + qs = qs.filter(activity=self.activity) + if qs.exists(): + raise ValidationError(_("This person is already invited.")) + + qs = Guest.objects.filter(inviter=self.inviter, activity=self.activity) + if len(qs) >= 3: + raise ValidationError(_("You can't invite more than 3 people to this activity.")) return super().save(force_insert, force_update, using, update_fields) diff --git a/apps/activity/views.py b/apps/activity/views.py index 5df3493c8a8176d32c3a3c543ebd63464cef0b38..feb7591d9f8cdf98ebc0a6a844ef95e8a6c94988 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -1,6 +1,6 @@ # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later -from datetime import datetime +from datetime import datetime, timezone from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.contenttypes.models import ContentType @@ -61,6 +61,8 @@ class ActivityDetailView(LoginRequiredMixin, DetailView): .filter(PermissionBackend.filter_queryset(self.request.user, Guest, "view"))) ctx["guests"] = table + ctx["activity_started"] = datetime.now(timezone.utc) > self.object.date_start + return ctx diff --git a/apps/note/models/notes.py b/apps/note/models/notes.py index d74d914728f9507a3f4cac30ccb387d6d707d4a9..89e2b31ab941ee73f6edf5deaaf2f3b60736ff42 100644 --- a/apps/note/models/notes.py +++ b/apps/note/models/notes.py @@ -176,35 +176,6 @@ class NoteSpecial(Note): return self.special_type -class NoteCommon(Note): - """ - A :model:`note.Note` for special accounts, where real money enter or leave the system - - bank check - - credit card - - bank transfer - - cash - - refund - This Type of Note is not associated to a :model:`auth.User` or :model:`member.Club` . - """ - note_name = models.CharField( - max_length=255, - unique=True, - ) - - club = models.ForeignKey( - Club, - on_delete=models.PROTECT, - verbose_name=_("club"), - ) - - class Meta: - verbose_name = _("common note") - verbose_name_plural = _("common notes") - - def __str__(self): - return self.note_name - - class Alias(models.Model): """ points toward a :model:`note.NoteUser` or :model;`note.NoteClub` instance. diff --git a/templates/activity/activity_detail.html b/templates/activity/activity_detail.html index 07c10a1524f47a9290d03cf32f028c94eb6a4b6a..0ed3c7198643d468b624427ab24d5c1dc49e1907 100644 --- a/templates/activity/activity_detail.html +++ b/templates/activity/activity_detail.html @@ -66,7 +66,7 @@ {% if "view_"|has_perm:activity %} <a class="btn btn-primary btn-sm my-1" href="{% url 'activity:activity_update' pk=activity.pk %}"> {% trans "edit"|capfirst %}</a> {% endif %} - {% if activity.activity_type.can_invite %} + {% if activity.activity_type.can_invite and not activity_started %} <a class="btn btn-primary btn-sm my-1" href="{% url 'activity:activity_invite' pk=activity.pk %}"> {% trans "Invite" %}</a> {% endif %} </div>