diff --git a/apps/activity/models.py b/apps/activity/models.py index fe2cfb20..67b16466 100644 --- a/apps/activity/models.py +++ b/apps/activity/models.py @@ -7,7 +7,7 @@ from threading import Thread from django.conf import settings from django.contrib.auth.models import User -from django.db import models +from django.db import models, transaction from django.db.models import Q from django.utils import timezone from django.utils.translation import gettext_lazy as _ @@ -123,6 +123,7 @@ class Activity(models.Model): verbose_name=_('open'), ) + @transaction.atomic def save(self, *args, **kwargs): """ Update the activity wiki page each time the activity is updated (validation, change description, ...) @@ -194,8 +195,8 @@ class Entry(models.Model): else _("Entry for {note} to the activity {activity}").format( guest=str(self.guest), note=str(self.note), activity=str(self.activity)) + @transaction.atomic def save(self, *args, **kwargs): - qs = Entry.objects.filter(~Q(pk=self.pk), activity=self.activity, note=self.note, guest=self.guest) if qs.exists(): raise ValidationError(_("Already entered on ") + _("{:%Y-%m-%d %H:%M:%S}").format(qs.get().time, )) @@ -260,6 +261,7 @@ class Guest(models.Model): except AttributeError: return False + @transaction.atomic def save(self, force_insert=False, force_update=False, using=None, update_fields=None): one_year = timedelta(days=365) diff --git a/apps/activity/views.py b/apps/activity/views.py index 7de31b0c..2f5c7e0b 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -7,6 +7,7 @@ from django.conf import settings from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.contenttypes.models import ContentType from django.core.exceptions import PermissionDenied +from django.db import transaction from django.db.models import F, Q from django.http import HttpResponse from django.urls import reverse_lazy @@ -44,6 +45,7 @@ class ActivityCreateView(ProtectQuerysetMixin, ProtectedCreateView): date_end=timezone.now(), ) + @transaction.atomic def form_valid(self, form): form.instance.creater = self.request.user return super().form_valid(form) @@ -145,6 +147,7 @@ class ActivityInviteView(ProtectQuerysetMixin, ProtectedCreateView): form.fields["inviter"].initial = self.request.user.note return form + @transaction.atomic def form_valid(self, form): form.instance.activity = Activity.objects\ .filter(PermissionBackend.filter_queryset(self.request.user, Activity, "view")).get(pk=self.kwargs["pk"]) diff --git a/apps/member/forms.py b/apps/member/forms.py index 20de91b7..5081a12e 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -8,6 +8,7 @@ from django import forms from django.conf import settings from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.models import User +from django.db import transaction from django.forms import CheckboxSelectMultiple from django.utils import timezone from django.utils.translation import gettext_lazy as _ @@ -57,6 +58,7 @@ class ProfileForm(forms.ModelForm): self.fields['address'].widget.attrs.update({"placeholder": "4 avenue des Sciences, 91190 GIF-SUR-YVETTE"}) self.fields['promotion'].widget.attrs.update({"max": timezone.now().year}) + @transaction.atomic def save(self, commit=True): if not self.instance.section or (("department" in self.changed_data or "promotion" in self.changed_data) and "section" not in self.changed_data): @@ -161,7 +163,7 @@ class MembershipForm(forms.ModelForm): soge = forms.BooleanField( label=_("Inscription paid by Société Générale"), required=False, - help_text=_("Check this case is the Société Générale paid the inscription."), + help_text=_("Check this case if the Société Générale paid the inscription."), ) credit_type = forms.ModelChoiceField( diff --git a/apps/member/models.py b/apps/member/models.py index c7467120..ff8f2b88 100644 --- a/apps/member/models.py +++ b/apps/member/models.py @@ -7,7 +7,7 @@ import os from django.conf import settings from django.contrib.auth.models import User from django.core.exceptions import ValidationError -from django.db import models +from django.db import models, transaction from django.db.models import Q from django.template import loader from django.urls import reverse, reverse_lazy @@ -271,6 +271,7 @@ class Club(models.Model): self._force_save = True self.save(force_update=True) + @transaction.atomic def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if not self.require_memberships: @@ -406,6 +407,7 @@ class Membership(models.Model): parent_membership.roles.set(Role.objects.filter(name="Membre de club").all()) parent_membership.save() + @transaction.atomic def save(self, *args, **kwargs): """ Calculate fee and end date before saving the membership and creating the transaction if needed. @@ -475,8 +477,13 @@ class Membership(models.Model): # to treasurers. transaction.valid = False from treasury.models import SogeCredit - soge_credit = SogeCredit.objects.get_or_create(user=self.user)[0] - soge_credit.refresh_from_db() + if SogeCredit.objects.filter(user=self.user).exists(): + soge_credit = SogeCredit.objects.get(user=self.user) + else: + soge_credit = SogeCredit(user=self.user) + soge_credit._force_save = True + soge_credit.save(force_insert=True) + soge_credit.refresh_from_db() transaction.save(force_insert=True) transaction.refresh_from_db() soge_credit.transactions.add(transaction) diff --git a/apps/member/templates/member/includes/profile_info.html b/apps/member/templates/member/includes/profile_info.html index 372592d5..b7f2fe70 100644 --- a/apps/member/templates/member/includes/profile_info.html +++ b/apps/member/templates/member/includes/profile_info.html @@ -38,7 +38,7 @@
@@ -44,6 +44,7 @@ SPDX-License-Identifier: GPL-3.0-or-later