3
0
Fork 0
mirror of https://github.com/nanoy42/coope synced 2024-05-20 08:11:47 +00:00

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

This commit is contained in:
Yoann Pétri 2018-12-23 18:52:18 +01:00
parent e28f564afa
commit e5456b4d21
7 changed files with 82 additions and 10 deletions

View file

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

View file

@ -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()

View file

@ -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"])

View file

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

View file

@ -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):

View file

@ -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">

View file

@ -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