From ab94383a1e424d5738b738139e675e2b4c186a12 Mon Sep 17 00:00:00 2001 From: Christian Dresen <c.dresen@fh-muenster.de> Date: Wed, 6 Jan 2016 17:45:11 +0100 Subject: [PATCH] Warpfood Added possibility to choose Food from a List of Products --- web/warpfood/models.py | 32 ++++++++-- web/warpfood/templates/warpfood/main.html | 6 +- web/warpfood/templates/warpfood/view.html | 71 +++++++++++++++++++++-- web/warpfood/util.py | 5 ++ web/warpfood/views.py | 27 +++++++-- 5 files changed, 123 insertions(+), 18 deletions(-) diff --git a/web/warpfood/models.py b/web/warpfood/models.py index 957fdad..acafc12 100644 --- a/web/warpfood/models.py +++ b/web/warpfood/models.py @@ -3,18 +3,38 @@ from django.forms import ModelForm, HiddenInput from django import forms from django.utils import timezone +# +# Models for WarpFood +# ToDo: FoodProduct Size not required +# -class PizzaService(models.Model): +class FoodService(models.Model): name = models.CharField(max_length=250) phone = models.CharField(max_length=250) def __str__(self): return self.name +class FoodCategory(models.Model): + name = models.CharField(max_length=250) + + def __str__(self): + return self.name + +class FoodProduct(models.Model): + name = models.CharField(max_length=250) + food_service = models.ForeignKey(FoodService, on_delete=models.CASCADE) + food_category = models.ForeignKey(FoodCategory, on_delete=models.CASCADE) + size = models.CharField(max_length=100, null=True) + price = models.FloatField() + + def __str__(self): + return self.name + " - " + self.size + class FoodSheet(models.Model): date = models.DateTimeField(default=timezone.now) - pizza_service = models.ForeignKey(PizzaService, on_delete=models.CASCADE) + food_service = models.ForeignKey(FoodService, on_delete=models.CASCADE) estimated_order_time = models.DateTimeField() closed = models.BooleanField(default=False) order_user = models.CharField(max_length=100, null=True) @@ -28,13 +48,13 @@ class FoodOrder(models.Model): size = models.CharField(max_length=100, null=True) comment = models.CharField(max_length=100, null=True) price = models.FloatField() - paid = models.BooleanField() + paid = models.BooleanField(default=False) class FoodSheetForm(ModelForm): class Meta: model = FoodSheet - fields = ['pizza_service', 'estimated_order_time'] + fields = ['food_service', 'estimated_order_time'] class FoodOrderForm(ModelForm): @@ -53,7 +73,7 @@ class FoodOrderFormExt(ModelForm): fields = ['sheet', 'user', 'article', 'size', 'comment', 'price', 'paid'] widgets = {'sheet': HiddenInput(), 'paid': HiddenInput()} -class PizzaServiceForm(ModelForm): +class FoodServiceForm(ModelForm): class Meta: - model = PizzaService + model = FoodService fields = ['name', 'phone'] diff --git a/web/warpfood/templates/warpfood/main.html b/web/warpfood/templates/warpfood/main.html index b878adc..8df769b 100644 --- a/web/warpfood/templates/warpfood/main.html +++ b/web/warpfood/templates/warpfood/main.html @@ -1,8 +1,8 @@ {% extends "base.html" %} {% load i18n %} - - {% load bootstrap %} +{% load humanize %} +{% load bootstrap %} {% block content %} {% if user.is_authenticated %} @@ -26,7 +26,7 @@ </thead> <tbody> {% for sheet in food_sheets %} - <tr data-link="/pizza/view/{{ sheet.id }}/"><td>{{ sheet.estimated_order_time }}</td><td>{{ sheet.pizza_service }}</td></tr> + <tr data-link="/pizza/view/{{ sheet.id }}/"><td>{{ sheet.estimated_order_time | naturaltime }}</td><td>{{ sheet.food_service }}</td></tr> {% endfor %} </tbody> </table> diff --git a/web/warpfood/templates/warpfood/view.html b/web/warpfood/templates/warpfood/view.html index 2d60d09..e5d33a1 100644 --- a/web/warpfood/templates/warpfood/view.html +++ b/web/warpfood/templates/warpfood/view.html @@ -2,16 +2,16 @@ {% load i18n %} {% load bootstrap %} - +{% load humanize %} {% block content %} <div class="panel panel-default"> <div class="panel-body"> <div class="row"> <div class="col-md-8"> - <h4>{{ sheet.pizza_service.name }}</h4> - <small>{{ sheet.pizza_service.phone }}</small><br/><br/> - <small>{{ sheet.estimated_order_time }}</small><br/><br/> + <h4>{{ sheet.food_service.name }}</h4> + <small>{{ sheet.food_service.phone }}</small><br/><br/> + <small>{{ sheet.estimated_order_time | naturaltime }}</small><br/><br/> {% if user.is_authenticated %} <a href="" class="btn btn-primary">Edit Sheet</a> {% if not sheet.closed %} @@ -37,12 +37,19 @@ {% if error %} <div class="alert alert-danger"> {{ error }}</div> {% endif %} + <form class="form-horizontal" method="POST" role="form"> + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + <a class="btn btn-success" data-toggle="modal" data-target="#product_modal">{% trans "Choose from Products" %}</a><br> + </div> + </div> + {{ create_food_order|bootstrap_horizontal }} <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> {% csrf_token %} - <button style="float: left" type="submit" formmethod="post" class="btn btn-primary">{% trans "Create Food Sheet" %}</button> + <button style="float: left" type="submit" formmethod="post" class="btn btn-primary">{% trans "Order" %}</button> </div> </div> </form> @@ -88,4 +95,58 @@ {% endfor %} </tbody> </table> + + <br> + <br> + + <div class="modal fade" id="product_modal" tabindex="-1" role="dialog" aria-labelledby="label_product_modal"> + <div class="modal-dialog modal-lg" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span></button> + <h4 class="modal-title" id="label_product_modal">{% trans "Product List" %}</h4> + </div> + <div class="modal-body"> + <div> + <ul class="nav nav-tabs" role="tablist"> + {% for category in food_products %} + <li role="presentation"{% if category == "Pizza" %} class="active"{% endif %}> + <a href="#{{ category }}" aria-controls="{{ category }}" role="tab" data-toggle="tab">{% trans category %}</a> + </li> + {% endfor %} + </ul> + + <div class="tab-content"> + {% for category,products in food_products.items %} + <div role="tabpanel" class="tab-pane fade in{% if category == "Pizza" %} active {% endif %}" id="{{ category }}"> + <table class="table table-striped table-hover"> + {% for product in products %} + <tr data-link="javascript:choose_food_product('{{ product.name }}','{{ product.size }}','{{ product.price }}');"> + <td>{{ product.name }}</td> + <td>{{ product.size }}</td> + <td>{{ product.price }}</td></tr> + {% endfor %} + </table> + </div> + {% endfor %} + </div> + </div> + </div> + + </div> + </div> + </div> + {% endblock %} + +{% block custom_javascript %} + <script> + function choose_food_product(name, size, price) { + document.getElementById("id_article").value = name; + document.getElementById("id_size").value = size; + document.getElementById("id_price").value = price; + $('#product_modal').modal('hide') + } + </script> +{% endblock %} \ No newline at end of file diff --git a/web/warpfood/util.py b/web/warpfood/util.py index e2e0407..3afe878 100644 --- a/web/warpfood/util.py +++ b/web/warpfood/util.py @@ -1,6 +1,11 @@ +from django.contrib.humanize.templatetags.humanize import intcomma pages = {'pages': [ {"link":"pizza", "name": "PizzaSheet"}, {"link":"about", "name": "About"}, {"link":"logout", "name": "Logout"}, {"link":"admin", "name": "Admin"} ]} + +def format_euro(amount): + euro = round(float(amount), 2) + return "%s%s" % (intcomma(int(euro)), ("%0.2f" % euro)[-3:]) diff --git a/web/warpfood/views.py b/web/warpfood/views.py index c99b325..fc84234 100644 --- a/web/warpfood/views.py +++ b/web/warpfood/views.py @@ -9,7 +9,15 @@ from django.http import HttpResponse from reportlab.platypus import SimpleDocTemplate from reportlab.platypus.tables import Table, TableStyle, colors +# +# ToDo: Hidden Field Paid default value to false +# ToDo: Insert TemplateTag for Euro Format +# ToDo: Implement Datetime Field for Estimated Order Time +# ToDo: Username with hidden Field. Maybe insecure +# + def index(request): + pages['error'] = "" if request.method == 'POST': form = FoodSheetForm(request.POST) if form.is_valid: @@ -17,11 +25,13 @@ def index(request): else: pages['error'] = form.errors pages['food_sheets'] = FoodSheet.objects.all() - pages['pizza_services'] = PizzaService.objects.all() + pages['pizza_services'] = FoodService.objects.all() pages['create_food_sheet'] = FoodSheetForm() return HttpResponse(render(request, 'warpfood/main.html', pages)) + def view(request, sheet_id=0): + pages['error'] = "" if request.method == 'POST': form = FoodOrderForm(request.POST) if form.is_valid(): @@ -34,15 +44,24 @@ def view(request, sheet_id=0): sheet = FoodSheet.objects.get(id=sheet_id) pages['sheet'] = sheet pages['orders'] = FoodOrder.objects.filter(sheet=sheet) - sum = 0 + total_price = 0 for order in pages['orders']: - sum += order.price - pages['order_sum'] = sum + total_price += order.price + pages['order_sum'] = format_euro(total_price) if request.user.is_authenticated(): pages['create_food_order'] = FoodOrderForm(initial={'sheet': sheet_id, 'user': request.user, 'paid': True}) else: pages['create_food_order'] = FoodOrderFormExt(initial={'sheet': sheet_id, 'paid': True}) + # ToDO: remove DEBUG + + products = FoodProduct.objects.filter(food_service=sheet.food_service) + pages['food_products'] = {} + for product in products: + if product.food_category.name not in pages['food_products']: + pages['food_products'][product.food_category.name] = [] + pages['food_products'][product.food_category.name].append(product) + print pages['food_products'] return HttpResponse(render(request, 'warpfood/view.html', pages)) @login_required(login_url='/login/', redirect_field_name=None) -- GitLab