From e5456b4d210693f3350afe0e524c021990a43923 Mon Sep 17 00:00:00 2001 From: nanoy Date: Sun, 23 Dec 2018 18:52:18 +0100 Subject: [PATCH] =?UTF-8?q?Empecher=20l'utilisateur=20de=20consommer=20s'i?= =?UTF-8?q?l=20a=20gard=C3=A9=20trop=20de=20pintes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gestion/migrations/0004_auto_20181223_1830.py | 25 +++++++++++++++++++ gestion/models.py | 4 +-- gestion/views.py | 13 +++++++--- .../migrations/0003_auto_20181223_1440.py | 23 +++++++++++++++++ preferences/models.py | 1 + .../preferences/general_preferences.html | 12 ++++++--- users/models.py | 14 +++++++++-- 7 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 gestion/migrations/0004_auto_20181223_1830.py create mode 100644 preferences/migrations/0003_auto_20181223_1440.py diff --git a/gestion/migrations/0004_auto_20181223_1830.py b/gestion/migrations/0004_auto_20181223_1830.py new file mode 100644 index 0000000..de74c17 --- /dev/null +++ b/gestion/migrations/0004_auto_20181223_1830.py @@ -0,0 +1,25 @@ +# Generated by Django 2.1 on 2018-12-23 17:30 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('gestion', '0003_historicalpinte'), + ] + + operations = [ + migrations.AlterField( + model_name='pinte', + name='current_owner', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='pintes_owned_currently', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='pinte', + name='previous_owner', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='pintes_owned_previously', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/gestion/models.py b/gestion/models.py index 64a898e..ee03f91 100644 --- a/gestion/models.py +++ b/gestion/models.py @@ -230,7 +230,7 @@ class Pinte(models.Model): """ Stores a physical pinte """ - current_owner = models.ForeignKey(User, on_delete=models.PROTECT, null=True, default=None, related_name="pinte_owned_currently") - previous_owner = models.ForeignKey(User, on_delete=models.PROTECT, null=True, default=None, related_name="pinte_owned_previously") + current_owner = models.ForeignKey(User, on_delete=models.PROTECT, null=True, default=None, related_name="pintes_owned_currently") + previous_owner = models.ForeignKey(User, on_delete=models.PROTECT, null=True, default=None, related_name="pintes_owned_previously") last_update_date = models.DateTimeField(auto_now=True) history = HistoricalRecords() diff --git a/gestion/views.py b/gestion/views.py index 1767943..f19d30a 100644 --- a/gestion/views.py +++ b/gestion/views.py @@ -15,7 +15,7 @@ from decimal import * from .forms import ReloadForm, RefundForm, ProductForm, KegForm, MenuForm, GestionForm, SearchMenuForm, SearchProductForm, SelectPositiveKegForm, SelectActiveKegForm, PinteForm from .models import Product, Menu, Keg, ConsumptionHistory, KegHistory, Consumption, MenuHistory, Pinte -from preferences.models import PaymentMethod +from preferences.models import PaymentMethod, GeneralPreferences @active_required @login_required @@ -108,6 +108,7 @@ def order(request): order = json.loads(request.POST["order"]) menus = json.loads(request.POST["menus"]) listPintes = json.loads(request.POST["listPintes"]) + gp,_ = GeneralPreferences.objects.get_or_create(pk=1) if (not order) and (not menus): return HttpResponse("Pas de commande") adherentRequired = False @@ -119,14 +120,20 @@ def order(request): adherentRequired = adherentRequired or menu.adherent_required if(adherentRequired and not user.profile.is_adherent): return HttpResponse("N'est pas adhérent et devrait l'être") + # Partie un peu complexe : je libère toutes les pintes de la commande, puis je test + # s'il a trop de pintes non rendues, puis je réalloue les pintes + for pinte in listPintes: + allocate(pinte, None) + if(gp.lost_pintes_allowed and user.profile.nb_pintes >= gp.lost_pintes_allowed): + return HttpResponse("Impossible de réaliser la commande : l'utilisateur a perdu trop de pintes.") + for pinte in listPintes: + allocate(pinte, user) if(paymentMethod.affect_balance): if(user.profile.balance < amount): return HttpResponse("Solde inférieur au prix de la commande") else: user.profile.debit += amount user.save() - for pinte in listPintes: - allocate(pinte, user) for o in order: product = get_object_or_404(Product, pk=o["pk"]) quantity = int(o["quantity"]) diff --git a/preferences/migrations/0003_auto_20181223_1440.py b/preferences/migrations/0003_auto_20181223_1440.py new file mode 100644 index 0000000..b1a489b --- /dev/null +++ b/preferences/migrations/0003_auto_20181223_1440.py @@ -0,0 +1,23 @@ +# Generated by Django 2.1 on 2018-12-23 13:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('preferences', '0002_auto_20181221_2151'), + ] + + operations = [ + migrations.AddField( + model_name='generalpreferences', + name='lost_pintes_allowed', + field=models.PositiveIntegerField(default=0), + ), + migrations.AddField( + model_name='historicalgeneralpreferences', + name='lost_pintes_allowed', + field=models.PositiveIntegerField(default=0), + ), + ] diff --git a/preferences/models.py b/preferences/models.py index 3bff4f1..0ac2d69 100644 --- a/preferences/models.py +++ b/preferences/models.py @@ -31,6 +31,7 @@ class GeneralPreferences(models.Model): brewer = models.CharField(max_length=255, blank=True) grocer = models.CharField(max_length=255, blank=True) use_pinte_monitoring = models.BooleanField(default=False) + lost_pintes_allowed = models.PositiveIntegerField(default=0) history = HistoricalRecords() class Cotisation(models.Model): diff --git a/preferences/templates/preferences/general_preferences.html b/preferences/templates/preferences/general_preferences.html index 06ac677..08596d6 100644 --- a/preferences/templates/preferences/general_preferences.html +++ b/preferences/templates/preferences/general_preferences.html @@ -5,7 +5,7 @@
  • Message global
  • Site actif
  • Bureau
  • -
  • Autre
  • +
  • Suivi de pintes
  • {% endblock %} @@ -83,12 +83,18 @@
    -

    Autre

    +

    Suivi de pintes

    {{form.use_pinte_monitoring}} - + +
    +
    +
    +
    + {{form.lost_pintes_allowed}} +
    diff --git a/users/models.py b/users/models.py index bda3ba2..c3b0df9 100644 --- a/users/models.py +++ b/users/models.py @@ -119,6 +119,13 @@ class Profile(models.Model): alcohol += consumption.quantity * float(product.deg) * product.volume * 0.79 /10 /1000 return alcohol + @property + def nb_pintes(self): + """ + Return the number of pintes currently owned + """ + return self.user.pintes_owned_currently.count() + def __str__(self): return str(self.user) @@ -128,9 +135,12 @@ class Profile(models.Model): tente de retourner l'attribut de l'user associé à l'instance """ try: - r = super().__getattr__(name) + r = self.__getattribute__(name) except AttributeError: - r = getattr(self.user, name) + try: + r = super().__getattr__(name) + except AttributeError: + r = getattr(self.user, name) return r