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">&times;</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