2022-03-16 12:11:30 +01:00
|
|
|
import json
|
|
|
|
import sys
|
|
|
|
|
2022-11-02 21:55:36 +01:00
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
from django.conf import settings
|
2022-03-16 12:11:30 +01:00
|
|
|
from django.contrib.auth import authenticate
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
from django.contrib.auth import login
|
|
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
from django.contrib.auth.forms import AuthenticationForm
|
|
|
|
from django.http.response import HttpResponseRedirect
|
2022-11-02 21:55:36 +01:00
|
|
|
from django.http.response import FileResponse
|
2022-03-16 12:11:30 +01:00
|
|
|
from django.http.response import HttpResponse
|
|
|
|
from django.shortcuts import render
|
|
|
|
|
|
|
|
from django.utils.translation import gettext as _
|
|
|
|
from django.utils.formats import decimal
|
|
|
|
|
2023-02-17 22:01:09 +01:00
|
|
|
from . import db_queries
|
2022-03-16 12:11:30 +01:00
|
|
|
|
|
|
|
from .models import Drink
|
|
|
|
from .models import Order
|
|
|
|
from .models import RegisterTransaction
|
|
|
|
|
|
|
|
|
|
|
|
def login_page(request):
|
|
|
|
userlist = get_user_model().objects.filter(is_superuser=False).filter(is_active=True).order_by("username")
|
|
|
|
if request.method == "POST":
|
|
|
|
form = AuthenticationForm(request.POST)
|
|
|
|
username = request.POST['username']
|
|
|
|
password = request.POST['password']
|
|
|
|
user = authenticate(username=username,password=password)
|
|
|
|
if user:
|
|
|
|
if user.is_active:
|
|
|
|
login(request, user)
|
|
|
|
return HttpResponseRedirect("/")
|
|
|
|
else:
|
|
|
|
return render(request,'registration/login.html', {
|
|
|
|
"form": form,
|
|
|
|
"user_list": userlist,
|
|
|
|
"error_message": _("Invalid username or password.")
|
|
|
|
})
|
|
|
|
else:
|
|
|
|
if request.user.is_authenticated:
|
|
|
|
return HttpResponseRedirect("/")
|
|
|
|
form = AuthenticationForm()
|
|
|
|
return render(request,'registration/login.html', {
|
|
|
|
"form": form,
|
|
|
|
"user_list": userlist
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def index(request):
|
|
|
|
context = {
|
2022-05-16 11:00:24 +02:00
|
|
|
"available_drinks": Drink.objects.filter(available__gt=0).filter(deleted=False).order_by('product_name'),
|
2022-03-16 12:11:30 +01:00
|
|
|
}
|
|
|
|
return render(request, "index.html", context)
|
|
|
|
|
2023-02-11 17:23:57 +01:00
|
|
|
|
2022-03-16 12:11:30 +01:00
|
|
|
@login_required
|
|
|
|
def history(request):
|
|
|
|
context = {
|
2023-02-17 22:01:09 +01:00
|
|
|
"history": db_queries.select_history(request.user, language_code=request.LANGUAGE_CODE),
|
2022-03-16 12:11:30 +01:00
|
|
|
}
|
|
|
|
return render(request, "history.html", context)
|
|
|
|
|
2023-02-11 17:23:57 +01:00
|
|
|
|
2022-03-16 12:11:30 +01:00
|
|
|
@login_required
|
2022-11-04 20:35:28 +01:00
|
|
|
def order(request, drinkid):
|
2022-03-16 12:11:30 +01:00
|
|
|
try:
|
2022-11-04 20:35:28 +01:00
|
|
|
drink_ = Drink.objects.get(pk=drinkid)
|
2023-02-11 22:14:01 +01:00
|
|
|
context = {"drink": drink_}
|
2022-03-16 12:11:30 +01:00
|
|
|
return render(request, "order.html", context)
|
|
|
|
except Drink.DoesNotExist:
|
|
|
|
return HttpResponseRedirect("/")
|
|
|
|
|
2023-02-11 17:23:57 +01:00
|
|
|
|
2022-03-16 12:11:30 +01:00
|
|
|
@login_required
|
|
|
|
def deposit(request):
|
|
|
|
return render(request, "deposit.html", {})
|
|
|
|
|
2023-02-11 17:23:57 +01:00
|
|
|
|
2022-03-16 12:11:30 +01:00
|
|
|
@login_required
|
|
|
|
def statistics(request):
|
|
|
|
context = {
|
2023-02-17 22:01:09 +01:00
|
|
|
"orders_per_month": db_queries.orders_per_month(request.user),
|
|
|
|
"orders_per_weekday": db_queries.orders_per_weekday(request.user),
|
|
|
|
"orders_per_drink": db_queries.orders_per_drink(request.user),
|
2022-03-16 12:11:30 +01:00
|
|
|
}
|
|
|
|
return render(request, "statistics.html", context)
|
|
|
|
|
2023-02-11 17:23:57 +01:00
|
|
|
|
2022-10-15 19:37:01 +02:00
|
|
|
@login_required
|
|
|
|
def supply(request):
|
|
|
|
return render(request, "supply.html")
|
|
|
|
|
2023-02-11 17:23:57 +01:00
|
|
|
|
2022-03-16 12:11:30 +01:00
|
|
|
@login_required
|
|
|
|
def redirect_home(request):
|
|
|
|
return HttpResponseRedirect("/")
|
|
|
|
|
|
|
|
|
|
|
|
# API for XHR requests #
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def api_order_drink(request):
|
|
|
|
# check request -> make order
|
|
|
|
user = request.user
|
|
|
|
try:
|
|
|
|
if user.allow_order_with_negative_balance or user.balance > 0:
|
2022-11-04 20:35:28 +01:00
|
|
|
drinkid = int(request.POST["drinkid"])
|
|
|
|
amount = int(request.POST["numberofdrinks"])
|
|
|
|
drink = Drink.objects.get(pk=drinkid)
|
2022-05-24 18:49:04 +02:00
|
|
|
if ((drink.do_not_count and drink.available > 0) or (drink.available >= amount)) and not drink.deleted:
|
2022-03-16 12:11:30 +01:00
|
|
|
Order.objects.create(drink=drink, user=user, amount=amount)
|
|
|
|
return HttpResponse("success", status=200)
|
|
|
|
else:
|
|
|
|
return HttpResponse("notAvailable", status=400)
|
2022-10-15 19:37:01 +02:00
|
|
|
else: raise Exception("Unexpected input or missing privileges.")
|
2022-03-16 12:11:30 +01:00
|
|
|
except Exception as e:
|
|
|
|
print(f"An exception occured while processing an order: User: {user.username} - Exception: {e}", file=sys.stderr)
|
|
|
|
return HttpResponse(b"", status=500)
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def api_deposit(request):
|
|
|
|
# check request -> deposit
|
|
|
|
user = request.user
|
|
|
|
try:
|
2022-11-04 20:35:28 +01:00
|
|
|
amount = decimal.Decimal(request.POST["depositamount"])
|
2022-03-16 12:11:30 +01:00
|
|
|
if 0.00 < amount < 9999.99:
|
|
|
|
# create transaction
|
|
|
|
RegisterTransaction.objects.create(
|
|
|
|
transaction_sum=amount,
|
|
|
|
comment=f"User deposit by user {user.username}",
|
|
|
|
is_user_deposit=True,
|
2023-02-11 22:14:01 +01:00
|
|
|
user=user)
|
2022-03-16 12:11:30 +01:00
|
|
|
return HttpResponse("success", status=200)
|
|
|
|
else: raise Exception("Deposit amount too big or small.")
|
|
|
|
except Exception as e:
|
2022-10-15 19:37:01 +02:00
|
|
|
print(f"An exception occured while processing a transaction: User: {user.username} - Exception: {e}", file=sys.stderr)
|
|
|
|
return HttpResponse(b"", status=500)
|
|
|
|
|
2023-02-11 22:14:01 +01:00
|
|
|
|
2022-10-15 19:37:01 +02:00
|
|
|
@login_required
|
|
|
|
def api_supply(request):
|
|
|
|
# check request -> supply
|
|
|
|
user = request.user
|
|
|
|
try:
|
2022-11-04 20:35:28 +01:00
|
|
|
price = decimal.Decimal(request.POST["supplyprice"])
|
|
|
|
description = str(request.POST["supplydescription"])
|
2022-10-15 19:37:01 +02:00
|
|
|
if 0.00 < price < 9999.99 and (user.allowed_to_supply or user.is_superuser):
|
|
|
|
# create transaction
|
|
|
|
RegisterTransaction.objects.create(
|
|
|
|
transaction_sum=-price,
|
|
|
|
comment=f"Supply: {description}",
|
|
|
|
is_user_deposit=False,
|
|
|
|
user=user
|
|
|
|
)
|
|
|
|
return HttpResponse("success", status=200)
|
|
|
|
else: raise Exception("Unexpected input or missing privileges.")
|
|
|
|
except Exception as e:
|
|
|
|
print(f"An exception occured while processing a supply transaction: User: {user.username} - Exception: {e}", file=sys.stderr)
|
2022-03-16 12:11:30 +01:00
|
|
|
return HttpResponse(b"", status=500)
|