3
0
Fork 0
mirror of https://github.com/nanoy42/coope synced 2024-07-04 21:04:04 +00:00
coope/gestion/views.py

232 lines
9.3 KiB
Python
Raw Normal View History

2018-11-22 21:52:15 +00:00
from django.shortcuts import render, redirect, get_object_or_404
2018-10-05 22:03:02 +00:00
from django.contrib import messages
from django.urls import reverse
2018-11-22 21:52:15 +00:00
from django.http import HttpResponse, Http404
2018-10-05 22:03:02 +00:00
from django.contrib.auth.models import User
2018-11-22 21:52:15 +00:00
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required, permission_required
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
from coopeV3.acl import active_required, acl_or
import simplejson as json
2018-10-05 22:03:02 +00:00
from dal import autocomplete
2018-11-22 21:52:15 +00:00
from decimal import *
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
from .forms import ReloadForm, RefundForm, ProductForm, KegForm, MenuForm, GestionForm, SearchMenuForm, SearchProductForm
from .models import Product, Menu, Keg, ConsumptionHistory
from preferences.models import PaymentMethod
2018-08-31 12:46:35 +00:00
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@acl_or('gestion.add_consumptionhistory', 'gestion.add_reload', 'gestion.add_refund')
def manage(request):
2018-11-22 21:52:15 +00:00
pay_buttons = PaymentMethod.objects.filter(is_active=True)
2018-10-05 22:03:02 +00:00
gestion_form = GestionForm(request.POST or None)
reload_form = ReloadForm(request.POST or None)
refund_form = RefundForm(request.POST or None)
bieresPression = []
bieresBouteille = Product.objects.filter(category=Product.BOTTLE).filter(is_active=True)
panini = Product.objects.filter(category=Product.PANINI).filter(is_active=True)
food = Product.objects.filter(category=Product.FOOD).filter(is_active=True)
soft = Product.objects.filter(category=Product.SOFT).filter(is_active=True)
menus = Menu.objects.filter(is_active=True)
kegs = Keg.objects.filter(is_active=True)
for keg in kegs:
if(keg.pinte):
bieresPression.append(keg.pinte)
if(keg.demi):
bieresPression.append(keg.demi)
if(keg.galopin):
bieresPression.append(keg.galopin)
2018-11-22 21:52:15 +00:00
return render(request, "gestion/manage.html", {"gestion_form": gestion_form, "reload_form": reload_form, "refund_form": refund_form, "bieresPression": bieresPression, "bieresBouteille": bieresBouteille, "panini": panini, "food": food, "soft": soft, "menus": menus, "pay_buttons": pay_buttons})
@login_required
@permission_required('gestion.add_consumptionhistory')
@csrf_exempt
def order(request):
print(request.POST)
if("user" not in request.POST or "paymentMethod" not in request.POST or "amount" not in request.POST or "order" not in request.POST):
raise Http404("Erreur du POST")
else:
user = get_object_or_404(User, pk=request.POST['user'])
paymentMethod = get_object_or_404(PaymentMethod, pk=request.POST['paymentMethod'])
amount = Decimal(request.POST['amount'])
order = json.loads(request.POST["order"])
if(len(order) == 0 or amount == 0):
raise Http404("Pas de commande")
if(paymentMethod.affect_balance):
if(user.profile.balance < amount):
raise Http404("Solde inférieur au prix de la commande")
else:
user.profile.debit += amount
user.save()
for o in order:
print(o)
product = get_object_or_404(Product, pk=o["pk"])
ch = ConsumptionHistory(customer = user, quantity = int(o["quantity"]), paymentMethod=paymentMethod, product=product, amount=int(o["quantity"])*product.amount, coopeman=request.user)
ch.save()
return HttpResponse("La commande a bien été effectuée")
@login_required
@permission_required('gestion.add_reload')
2018-10-05 22:03:02 +00:00
def reload(request):
reload_form = ReloadForm(request.POST or None)
if(reload_form.is_valid()):
reloadEntry = reload_form.save(commit=False)
reloadEntry.coopeman = request.user
reloadEntry.save()
user = reload_form.cleaned_data['customer']
amount = reload_form.cleaned_data['amount']
user.profile.credit += amount
user.save()
messages.success(request,"Le compte de " + user.username + " a bien été crédité de " + str(amount) + "")
else:
messages.error(request, "Le rechargement a échoué")
return redirect(reverse('gestion:manage'))
2018-11-22 21:52:15 +00:00
@login_required
@permission_required('gestion.add_refund')
2018-10-05 22:03:02 +00:00
def refund(request):
refund_form = RefundForm(request.POST or None)
if(refund_form.is_valid()):
user = refund_form.cleaned_data['customer']
amount = refund_form.cleaned_data['amount']
if(amount <= user.profile.balance):
refundEntry = refund_form.save(commit = False)
refundEntry.coopeman = request.user
refundEntry.save()
user.profile.credit -= amount
user.save()
messages.success(request, "Le compte de " + user.username + " a bien été remboursé de " + str(amount) + "")
else:
messages.error(request, "Impossible de rembourser l'utilisateur " + user.username + " de " + str(amount) + "€ : il n'a que " + str(user.profile.balance) + "€ sur son compte.")
else:
messages.error(request, "Le remboursement a échoué")
return redirect(reverse('gestion:manage'))
2018-11-22 21:52:15 +00:00
########## Products ##########
@login_required
@acl_or('gestion.add_product', 'gestion.view_product', 'gestion.add_keg', 'gestion.view_keg', 'gestion.change_keg', 'gestion.view_menu', 'gestion.add_menu')
2018-10-05 22:03:02 +00:00
def productsIndex(request):
return render(request, "gestion/products_index.html")
2018-11-22 21:52:15 +00:00
@login_required
@permission_required('gestion.add_product')
2018-10-05 22:03:02 +00:00
def addProduct(request):
form = ProductForm(request.POST or None)
if(form.is_valid()):
form.save()
messages.success(request, "Le produit a bien été ajouté")
return redirect(reverse('gestion:productsIndex'))
return render(request, "form.html", {"form": form, "form_title": "Ajout d'un produit", "form_button": "Ajouter"})
2018-11-22 21:52:15 +00:00
@login_required
@permission_required('gestion.view_product')
2018-10-05 22:03:02 +00:00
def productsList(request):
products = Product.objects.all()
return render(request, "gestion/products_list.html", {"products": products})
2018-11-22 21:52:15 +00:00
@login_required
@permission_required('gestion.view_product')
def searchProduct(request):
form = SearchProductForm(request.POST or None)
if(form.is_valid()):
return redirect(reverse('gestion:productProfile', kwargs={'pk': form.cleaned_data['product'].pk }))
return render(request, "form.html", {"form": form, "form_title":"Rechercher un produit", "form_button": "Rechercher"})
@login_required
@permission_required('gestion.view_product')
def productProfile(request, pk):
product = get_object_or_404(Product, pk=pk)
return render(request, "gestion/product_profile.html", {"product": product})
@login_required
2018-10-05 22:03:02 +00:00
def getProduct(request, barcode):
product = Product.objects.get(barcode=barcode)
2018-11-22 21:52:15 +00:00
data = json.dumps({"pk": product.pk, "barcode" : product.barcode, "name": product.name, "amount" : product.amount})
2018-10-05 22:03:02 +00:00
return HttpResponse(data, content_type='application/json')
2018-11-22 21:52:15 +00:00
class ProductsAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
qs = Product.objects.all()
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
2018-10-05 22:03:02 +00:00
########## Kegs ##########
2018-11-22 21:52:15 +00:00
@login_required
@permission_required('gestion.add_keg')
2018-10-05 22:03:02 +00:00
def addKeg(request):
form = KegForm(request.POST or None)
if(form.is_valid()):
keg = form.save()
messages.success(request, "Le fût " + keg.name + " a bien été ajouté")
return redirect(reverse('gestion:productsIndex'))
return render(request, "form.html", {"form":form, "form_title": "Ajout d'un fût", "form_button": "Ajouter"})
########## Menus ##########
2018-11-22 21:52:15 +00:00
@login_required
@permission_required('gestion.add_menu')
2018-10-05 22:03:02 +00:00
def addMenu(request):
form = MenuForm(request.POST or None)
extra_css = "#id_articles{height:200px;}"
if(form.is_valid()):
menu = form.save()
messages.success(request, "Le menu " + menu.name + " a bien été ajouté")
return redirect(reverse('gestion:productsIndex'))
return render(request, "form.html", {"form":form, "form_title": "Ajout d'un menu", "form_button": "Ajouter", "extra_css": extra_css})
2018-11-22 21:52:15 +00:00
@login_required
@permission_required('gestion.view_menu')
def searchMenu(request):
"""
Search a menu via SearchMenuForm instance
**Context**
``form_entete``
The form title.
``form``
The SearchMenuForm instance.
``form_button``
The content of the form button.
**Template**
:template:`form.html`
"""
form = SearchMenuForm(request.POST or None)
if(form.is_valid()):
menu = form.menu
return redirect(reverse('gestion:changeMenu', kwargs={'pk':menu.pk}))
return render(request, "form.html", {"form": form, "form_title": "Recherche d'un menu", "form_button": "Modifier"})
class MenusAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
qs = Menu.objects.all()
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
########## Ranking ##########
@login_required
def ranking(request):
bestBuyers = User.objects.order_by('-profile__debit')[:25]
customers = User.objects.all()
list = []
for customer in customers:
alcohol = customer.profile.alcohol
list.append([customer, alcohol])
bestDrinkers = sorted(list, key=lambda x: x[1], reverse=True)[:25]
return render(request, "gestion/ranking.html", {"bestBuyers": bestBuyers, "bestDrinkers": bestDrinkers})
@login_required
def annualRanking(request):
return render(request, "gestion/annual_ranking.html")