Browse Source

Empecher l'utilisateur de consommer s'il a gardé trop de pintes

pull/4/head
Yoann Piétri 7 years ago
parent
commit
e5456b4d21
  1. 25
      gestion/migrations/0004_auto_20181223_1830.py
  2. 4
      gestion/models.py
  3. 13
      gestion/views.py
  4. 23
      preferences/migrations/0003_auto_20181223_1440.py
  5. 1
      preferences/models.py
  6. 12
      preferences/templates/preferences/general_preferences.html
  7. 14
      users/models.py

25
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),
),
]

4
gestion/models.py

@ -230,7 +230,7 @@ class Pinte(models.Model):
""" """
Stores a physical pinte Stores a physical pinte
""" """
current_owner = models.ForeignKey(User, on_delete=models.PROTECT, null=True, default=None, related_name="pinte_owned_currently") 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="pinte_owned_previously") 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) last_update_date = models.DateTimeField(auto_now=True)
history = HistoricalRecords() history = HistoricalRecords()

13
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 .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 .models import Product, Menu, Keg, ConsumptionHistory, KegHistory, Consumption, MenuHistory, Pinte
from preferences.models import PaymentMethod from preferences.models import PaymentMethod, GeneralPreferences
@active_required @active_required
@login_required @login_required
@ -108,6 +108,7 @@ def order(request):
order = json.loads(request.POST["order"]) order = json.loads(request.POST["order"])
menus = json.loads(request.POST["menus"]) menus = json.loads(request.POST["menus"])
listPintes = json.loads(request.POST["listPintes"]) listPintes = json.loads(request.POST["listPintes"])
gp,_ = GeneralPreferences.objects.get_or_create(pk=1)
if (not order) and (not menus): if (not order) and (not menus):
return HttpResponse("Pas de commande") return HttpResponse("Pas de commande")
adherentRequired = False adherentRequired = False
@ -119,14 +120,20 @@ def order(request):
adherentRequired = adherentRequired or menu.adherent_required adherentRequired = adherentRequired or menu.adherent_required
if(adherentRequired and not user.profile.is_adherent): if(adherentRequired and not user.profile.is_adherent):
return HttpResponse("N'est pas adhérent et devrait l'être") 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(paymentMethod.affect_balance):
if(user.profile.balance < amount): if(user.profile.balance < amount):
return HttpResponse("Solde inférieur au prix de la commande") return HttpResponse("Solde inférieur au prix de la commande")
else: else:
user.profile.debit += amount user.profile.debit += amount
user.save() user.save()
for pinte in listPintes:
allocate(pinte, user)
for o in order: for o in order:
product = get_object_or_404(Product, pk=o["pk"]) product = get_object_or_404(Product, pk=o["pk"])
quantity = int(o["quantity"]) quantity = int(o["quantity"])

23
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),
),
]

1
preferences/models.py

@ -31,6 +31,7 @@ class GeneralPreferences(models.Model):
brewer = models.CharField(max_length=255, blank=True) brewer = models.CharField(max_length=255, blank=True)
grocer = models.CharField(max_length=255, blank=True) grocer = models.CharField(max_length=255, blank=True)
use_pinte_monitoring = models.BooleanField(default=False) use_pinte_monitoring = models.BooleanField(default=False)
lost_pintes_allowed = models.PositiveIntegerField(default=0)
history = HistoricalRecords() history = HistoricalRecords()
class Cotisation(models.Model): class Cotisation(models.Model):

12
preferences/templates/preferences/general_preferences.html

@ -5,7 +5,7 @@
<li><a href="#first">Message global</a></li> <li><a href="#first">Message global</a></li>
<li><a href="#second">Site actif</a></li> <li><a href="#second">Site actif</a></li>
<li><a href="#third">Bureau</a></li> <li><a href="#third">Bureau</a></li>
<li><a href="#fourth">Autre</a></li> <li><a href="#fourth">Suivi de pintes</a></li>
</ul> </ul>
{% endblock %} {% endblock %}
@ -83,12 +83,18 @@
<div class="spotlight"> <div class="spotlight">
<div class="content"> <div class="content">
<header class="major"> <header class="major">
<h2>Autre</h2> <h2>Suivi de pintes</h2>
</header> </header>
<div class="row uniform"> <div class="row uniform">
<div class="12u"> <div class="12u">
{{form.use_pinte_monitoring}} {{form.use_pinte_monitoring}}
<label for="{{form.is_active.id_for_label}}">Utiliser le suivi de pinte ?</label> <label for="{{form.use_pinte_monitoring.id_for_label}}">Utiliser le suivi de pinte ?</label>
</div>
</div>
<div class="row uniform">
<div class="12u">
{{form.lost_pintes_allowed}}
<label for="{{form.lost_pintes_allowed.id_for_label}}">Nombre de pintes non rendues avant d'interdire la consommation (0 pour ne jamais l'interdire, nécessite le suivi de pinte actif)</label>
</div> </div>
</div> </div>
<div class="row uniform"> <div class="row uniform">

14
users/models.py

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

Loading…
Cancel
Save