diff --git a/SpitiGlykou/__pycache__/settings.cpython-311.pyc b/SpitiGlykou/__pycache__/settings.cpython-311.pyc index 7cc5570..68b29cb 100644 Binary files a/SpitiGlykou/__pycache__/settings.cpython-311.pyc and b/SpitiGlykou/__pycache__/settings.cpython-311.pyc differ diff --git a/orders_app/__pycache__/forms.cpython-311.pyc b/orders_app/__pycache__/forms.cpython-311.pyc index 80286e7..d82271c 100644 Binary files a/orders_app/__pycache__/forms.cpython-311.pyc and b/orders_app/__pycache__/forms.cpython-311.pyc differ diff --git a/orders_app/__pycache__/models.cpython-311.pyc b/orders_app/__pycache__/models.cpython-311.pyc index dee3aec..d482dfa 100644 Binary files a/orders_app/__pycache__/models.cpython-311.pyc and b/orders_app/__pycache__/models.cpython-311.pyc differ diff --git a/orders_app/__pycache__/views.cpython-311.pyc b/orders_app/__pycache__/views.cpython-311.pyc index c00c4e5..3ed6dad 100644 Binary files a/orders_app/__pycache__/views.cpython-311.pyc and b/orders_app/__pycache__/views.cpython-311.pyc differ diff --git a/orders_app/forms.py b/orders_app/forms.py index 032fc13..91e41d4 100644 --- a/orders_app/forms.py +++ b/orders_app/forms.py @@ -1,5 +1,5 @@ from crispy_forms.helper import FormHelper -from crispy_forms.layout import Layout, Field, Fieldset, Div, HTML, ButtonHolder, Submit +from crispy_forms.layout import Layout, Field, Fieldset, Div, Row, HTML, ButtonHolder, Submit from django import forms from django.urls import reverse_lazy from django.forms.models import inlineformset_factory @@ -8,6 +8,11 @@ from django_addanother.widgets import AddAnotherWidgetWrapper from orders_app.custom_layout_object import Formset from orders_app.models import Order, OrderProduct, Customer, Product, Store +from .models import * +from .custom_layout_object import Formset + +import re + class CustomerForm(forms.ModelForm): class Meta: @@ -78,6 +83,7 @@ class StoreForm(forms.ModelForm): class OrderLine(forms.ModelForm): class Meta: model = OrderProduct + exclude = () fields = ['id', 'order', 'product', 'amount', 'cake_type', 'cake_type_num', 'cake_color', 'cake_color_other', 'fyt_color', 'fyt_color_other', 'cake_flavor', 'cake_img', 'cream_cake_3d', 'cream_cake_height', 'cream_cake_img', 'engagement_cake_type', 'engagement_cake_base', 'engagement_cake_pcs', 'engagement_cake_pcs_other', 'engagement_cake_glaze', 'cup_flavor', 'cup_color', 'cup_color_other', 'cup_type', 'candy_bar_type', 'candy_bar_decor', 'candy_bar_decor_other', 'candy_bar_wrap', 'info'] widgets = { 'product': AddAnotherWidgetWrapper( @@ -92,9 +98,13 @@ class OrderLine(forms.ModelForm): 'info': forms.Textarea(attrs={'rows': 2, 'cols': 30}), } - def __init__(self, *arg, **kwarg): - super(OrderLine, self).__init__(*arg, **kwarg) - self.empty_permitted = False + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + formtag_prefix = re.sub('-[0-9]+$', '', kwargs.get('prefix', '')) + + self.helper = FormHelper() + self.helper.form_tag = False self.fields['product'].label = "Προϊόν" self.fields['amount'].label = "Ποσότητα" self.fields['cake_type'].label = "Τύπος" @@ -122,6 +132,40 @@ class OrderLine(forms.ModelForm): self.fields['candy_bar_decor_other'].label = "Ντεκόρ CandyBar Άλλο" self.fields['candy_bar_wrap'].label = "Τύλιγμα CandyBar" self.fields['info'].label = "Πληροφορίες" + self.helper.layout = Layout( + Row( + Field('product'), + Field('amount'), + Field('cake_type'), + Field('cake_type_num'), + Field('cake_color'), + Field('cake_color_other'), + Field('fyt_color'), + Field('fyt_color_other'), + Field('cake_flavor'), + Field('cake_img'), + Field('cream_cake_3d'), + Field('cream_cake_height'), + Field('cream_cake_img'), + Field('engagement_cake_type'), + Field('engagement_cake_base'), + Field('engagement_cake_pcs'), + Field('engagement_cake_pcs_other'), + Field('engagement_cake_glaze'), + Field('cup_flavor'), + Field('cup_color'), + Field('cup_color_other'), + Field('cup_type'), + Field('candy_bar_type'), + Field('candy_bar_decor'), + Field('candy_bar_decor_other'), + Field('candy_bar_wrap'), + Field('info'), + Field('DELETE'), + css_class='formset_row-{}'.format(formtag_prefix) + ) + ) + OrderLineFormSet = inlineformset_factory( @@ -138,6 +182,7 @@ OrderLineFormSetEdit = inlineformset_factory( class OrderForm(forms.ModelForm): class Meta: model = Order + exclude = () fields = ['order_status', 'customer_name', 'customer_address', 'customer_telephone', 'customer_email', 'delivery', 'delivery_date', 'store', 'order_info', 'order_products'] widgets = { 'delivery_date': forms.DateInput(attrs={'type': 'text', 'id': 'delivery_date', 'class': 'datepicker'}), @@ -150,10 +195,10 @@ class OrderForm(forms.ModelForm): } def __init__(self, *args, **kwargs): - super(OrderForm, self).__init__(*args, **kwargs) + super(OrderForm, self).__init__(*args, **kwargs) self.helper = FormHelper() self.helper.form_tag = True - self.helper.render_hidden_fields = True + #self.helper.render_hidden_fields = True self.helper.form_class = 'form-horizontal' self.helper.label_class = 'col-md-3 create-label' self.helper.field_class = 'col-md-9' diff --git a/orders_app/models.py b/orders_app/models.py index 3b83d00..120f5b8 100644 --- a/orders_app/models.py +++ b/orders_app/models.py @@ -3,7 +3,6 @@ from django.core.validators import MinValueValidator, MaxValueValidator from django.db import models from phonenumber_field.modelfields import PhoneNumberField - class Store(models.Model): name = models.CharField(max_length=128) address = models.CharField(max_length=128) @@ -190,7 +189,7 @@ class OrderProduct(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE) amount = models.FloatField(validators=[MinValueValidator(0.01), MaxValueValidator(999)]) - #az = 'ΚΙΛΑ ΓΕΥΣΗ KARDASIS Νο ΧΡΩΜΑ ΦΥΤΙΛΑΚΙ ΠΑΡΑΤΗΡΗΣΕΙΣ' + #vars = 'ΚΙΛΑ ΓΕΥΣΗ KARDASIS Νο ΧΡΩΜΑ ΦΥΤΙΛΑΚΙ ΠΑΡΑΤΗΡΗΣΕΙΣ' cake_type = models.CharField(max_length=45, choices=CAKE_TYPES, blank=True, null=True) cake_type_num = models.FloatField(max_length=128, default="0", blank=True, null=True) cake_color = models.CharField(max_length=45, choices=COLOR_OPTIONS, blank=True, null=True) @@ -199,19 +198,19 @@ class OrderProduct(models.Model): fyt_color_other = models.CharField(max_length=128, blank=True, null=True) cake_flavor = models.CharField(max_length=45, choices=CAKE_FLAVORS, blank=True, null=True) cake_img = models.ImageField(blank=True, null=True) - #az = 'ΜΕΓΕΘΟΣ ΥΨΟΣ ΓΕΥΣΗ ΠΑΡΑΤΗΡΗΣΕΙΣ' + #vars = 'ΜΕΓΕΘΟΣ ΥΨΟΣ ΓΕΥΣΗ ΠΑΡΑΤΗΡΗΣΕΙΣ' cream_cake_3d = models.CharField(max_length=45, choices=CREAM_3D, default="ΟΧΙ", blank=True) cream_cake_height = models.FloatField(max_length=128, default="0", blank=True, null=True) cream_cake_img = models.ImageField(blank=True, null=True) - #az = 'ΓΑΜΟΣ ΒΑΣΗ ΤΕΜΑΧΙΑ ΓΕΥΣΗ ΠΑΡΑΤΗΡΗΣΕΙΣ' + #vars = 'ΓΑΜΟΣ ΒΑΣΗ ΤΕΜΑΧΙΑ ΓΕΥΣΗ ΠΑΡΑΤΗΡΗΣΕΙΣ' engagement_cake_type = models.CharField(max_length=45, choices=ENGAMENT_TYPE, blank=True, null=True) engagement_cake_base = models.CharField(max_length=128, blank=True, null=True) engagement_cake_pcs = models.CharField(max_length=45, choices=ENGAMENT_CAKE_PIECES, blank=True, null=True) engagement_cake_pcs_other = models.CharField(max_length=128, blank=True, null=True) engagement_cake_glaze = models.CharField(max_length=45, choices=ENGAMENT_CAKE_GLAZE, blank=True, null=True) - #az = 'ΤΕΜΑΧΙΑ ΓΕΥΣΗ ΚΥΠΕΛΛΟ ΧΡΩΜΑ ΤΕΜΑΧΙΑ ΧΡΩΜΑ ΔΙΑΚΟΣΜΗΣΗ ΤΥΛΙΓΜΕΝΑ ΠΑΡΑΤΗΡΗΣΕΙΣ' + #vars = 'ΤΕΜΑΧΙΑ ΓΕΥΣΗ ΚΥΠΕΛΛΟ ΧΡΩΜΑ ΤΕΜΑΧΙΑ ΧΡΩΜΑ ΔΙΑΚΟΣΜΗΣΗ ΤΥΛΙΓΜΕΝΑ ΠΑΡΑΤΗΡΗΣΕΙΣ' cup_flavor = models.CharField(max_length=45, choices=CUP_FLAVORS, blank=True, null=True) cup_color = models.CharField(max_length=45, choices=COLOR_OPTIONS, blank=True, null=True) cup_color_other = models.CharField(max_length=128, blank=True, null=True) diff --git a/orders_app/users.txt b/orders_app/users.txt index f7a5dfd..d2fea5d 100644 --- a/orders_app/users.txt +++ b/orders_app/users.txt @@ -7,6 +7,9 @@ sp1!glk2 spiti3 sp4$glku3 +spiti4 +sp5%glku4 + pronorth pro1!north123!@# diff --git a/orders_app/views.py b/orders_app/views.py index e85c40c..3137da5 100644 --- a/orders_app/views.py +++ b/orders_app/views.py @@ -15,6 +15,10 @@ from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfgen import canvas from textwrap import wrap +from .models import * +from .forms import * +from django.views.generic.edit import CreateView, UpdateView +from django.db import transaction from orders_app.forms import OrderForm, OrderLineFormSet, CustomerForm, ProductForm, StoreForm,\ @@ -267,17 +271,39 @@ class PrintView(View): class DashboardPageView(LoginRequiredMixin, TemplateView): template_name = "diaxeirisi/Dashboard.Default.html" - + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - time_delta = datetime.today() - timedelta(days=30) - + time_delta = datetime.today() - timedelta(days=90) + try: + all_orders = self.request.GET['all_orders'] + except KeyError: + all_orders = False if self.request.user.id == 3: - context["DB_Objects"] = Order.objects.filter(store=1).filter(order_date__gte=time_delta).order_by('id').reverse() + if all_orders: + context["DB_Objects"] = Order.objects.filter(store_id=3).order_by('id').reverse() + else: + context["DB_Objects"] = Order.objects.filter(store_id=3).filter(order_date__gte=time_delta).order_by('id').reverse() elif self.request.user.id == 4: - context["DB_Objects"] = Order.objects.filter(store=2).filter(order_date__gte=time_delta).order_by('id').reverse() + if all_orders: + context["DB_Objects"] = Order.objects.filter(store_id=4).order_by('id').reverse() + else: + context["DB_Objects"] = Order.objects.filter(store_id=4).filter(order_date__gte=time_delta).order_by('id').reverse() elif self.request.user.id == 5: - context["DB_Objects"] = Order.objects.filter(store=3).filter(order_date__gte=time_delta).order_by('id').reverse() + if all_orders: + context["DB_Objects"] = Order.objects.filter(store_id=5).order_by('id').reverse() + else: + context["DB_Objects"] = Order.objects.filter(store_id=5).filter(order_date__gte=time_delta).order_by('id').reverse() + elif self.request.user.id == 6: + if all_orders: + context["DB_Objects"] = Order.objects.filter(store_id=6).order_by('id').reverse() + else: + context["DB_Objects"] = Order.objects.filter(store_id=6).filter(order_date__gte=time_delta).order_by('id').reverse() + elif self.request.user.id == 7: + if all_orders: + context["DB_Objects"] = Order.objects.filter(store_id=7).order_by('id').reverse() + else: + context["DB_Objects"] = Order.objects.filter(store_id=7).filter(order_date__gte=time_delta).order_by('id').reverse() else: context["DB_Objects"] = Order.objects.filter(order_date__gte=time_delta).order_by('id').reverse() context["active_page"] = 'dashboard' @@ -297,24 +323,32 @@ class ProductPageView(LoginRequiredMixin, TemplateView): class OrderProductsPageView(LoginRequiredMixin, TemplateView): template_name = "diaxeirisi/Dashboard.OrderProducts.html" - time_delta = datetime.today() - timedelta(days=30) + + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - print(self.request.user.id) if self.request.user.id == 3: - order_ids = Order.objects.filter(store=1).filter(order_date__gte=time_delta).order_by('id').reverse() + order_ids = Order.objects.filter(store_id=3).order_by('-id')[:200] order_ids = list(answer.id for answer in order_ids) context["DB_Objects"] = OrderProduct.objects.filter(order_id__in=order_ids) elif self.request.user.id == 4: - order_ids = Order.objects.filter(store=2).filter(order_date__gte=time_delta).order_by('id').reverse() + order_ids = Order.objects.filter(store_id=4).order_by('-id')[:200] order_ids = list(answer.id for answer in order_ids) context["DB_Objects"] = OrderProduct.objects.filter(order_id__in=order_ids) elif self.request.user.id == 5: - order_ids = Order.objects.filter(store=3).filter(order_date__gte=time_delta).order_by('id').reverse() + order_ids = Order.objects.filter(store_id=5).order_by('-id')[:200] + order_ids = list(answer.id for answer in order_ids) + context["DB_Objects"] = OrderProduct.objects.filter(order_id__in=order_ids) + elif self.request.user.id == 6: + order_ids = Order.objects.filter(store_id=6).order_by('-id')[:200] + order_ids = list(answer.id for answer in order_ids) + context["DB_Objects"] = OrderProduct.objects.filter(order_id__in=order_ids) + elif self.request.user.id == 7: + order_ids = Order.objects.filter(store_id=7).order_by('-id')[:200] order_ids = list(answer.id for answer in order_ids) context["DB_Objects"] = OrderProduct.objects.filter(order_id__in=order_ids) else: - context["DB_Objects"] = OrderProduct.objects.all().filter(order_date__gte=time_delta).order_by('id').reverse() + context["DB_Objects"] = OrderProduct.objects.all().order_by('-id')[:200] context["active_page"] = 'products' return context @@ -449,6 +483,7 @@ class OrderUpdate(UpdateView): form_class = OrderForm template_name = 'orders/order_create.html' + def get_success_url(self): return reverse_lazy('orders_app:order_update', kwargs={'pk': self.object.pk}) @@ -458,25 +493,27 @@ class OrderUpdate(UpdateView): def get_order_id(self): return self.kwargs['pk'] - def get_context_data(self, **kwargs): - context = super(OrderUpdate, self).get_context_data(**kwargs) + + def get_context_data(self, *args, **kwargs): + data = super(OrderUpdate, self).get_context_data(**kwargs) if self.request.POST: - context['order_products'] = OrderLineFormSetEdit(self.request.POST, self.request.FILES, instance=self.object) + data['order_products'] = OrderLineFormSetEdit(self.request.POST, instance=self.object) else: - context['order_products'] = OrderLineFormSetEdit(instance=self.object) - return context + data['order_products'] = OrderLineFormSetEdit(instance=self.object) + return data + + def post(self, request, *args, **kwargs): order_data = Order.objects.get(id=self.get_order_id()) #order_line_data = OrderProduct.objects.filter(order=self.get_order_id()) form = OrderForm(self.request.POST, self.request.FILES, instance=order_data) #, initial={model_to_dict(order_data)} order_products = OrderLineFormSetEdit(self.request.POST, self.request.FILES, instance=form.instance) + if form.is_valid() and order_products.is_valid(): form.save() for inline_form in order_products: - if not inline_form.cleaned_data['DELETE']: - inline_form.save() - + inline_form.save() messages.success(self.request, "Η παραγγελία αποθηκευτηκέ") return HttpResponseRedirect(request.META['HTTP_REFERER']) else: diff --git a/static/formset/jquery.formset.js b/static/formset/jquery.formset.js new file mode 100644 index 0000000..657766d --- /dev/null +++ b/static/formset/jquery.formset.js @@ -0,0 +1,248 @@ +/** + * jQuery Formset 1.5-pre + * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) + * @requires jQuery 1.2.6 or later + * + * Copyright (c) 2009, Stanislaus Madueke + * All rights reserved. + * + * Licensed under the New BSD License + * See: http://www.opensource.org/licenses/bsd-license.php + */ +;(function($) { + $.fn.formset = function(opts) + { + var options = $.extend({}, $.fn.formset.defaults, opts), + flatExtraClasses = options.extraClasses.join(' '), + totalForms = $('#id_' + options.prefix + '-TOTAL_FORMS'), + maxForms = $('#id_' + options.prefix + '-MAX_NUM_FORMS'), + minForms = $('#id_' + options.prefix + '-MIN_NUM_FORMS'), + childElementSelector = 'input,select,textarea,label,div', + $$ = $(this), + + applyExtraClasses = function(row, ndx) { + if (options.extraClasses) { + row.removeClass(flatExtraClasses); + row.addClass(options.extraClasses[ndx % options.extraClasses.length]); + } + }, + + updateElementIndex = function(elem, prefix, ndx) { + var idRegex = new RegExp(prefix + '-(\\d+|__prefix__)-'), + replacement = prefix + '-' + ndx + '-'; + if (elem.attr("for")) elem.attr("for", elem.attr("for").replace(idRegex, replacement)); + if (elem.attr('id')) elem.attr('id', elem.attr('id').replace(idRegex, replacement)); + if (elem.attr('name')) elem.attr('name', elem.attr('name').replace(idRegex, replacement)); + }, + + hasChildElements = function(row) { + return row.find(childElementSelector).length > 0; + }, + + showAddButton = function() { + return maxForms.length == 0 || // For Django versions pre 1.2 + (maxForms.val() == '' || (maxForms.val() - totalForms.val() > 0)); + }, + + /** + * Indicates whether delete link(s) can be displayed - when total forms > min forms + */ + showDeleteLinks = function() { + return minForms.length == 0 || // For Django versions pre 1.7 + (minForms.val() == '' || (totalForms.val() - minForms.val() > 0)); + }, + + insertDeleteLink = function(row) { + var delCssSelector = $.trim(options.deleteCssClass).replace(/\s+/g, '.'), + addCssSelector = $.trim(options.addCssClass).replace(/\s+/g, '.'); + + var delButtonHTML = '' + options.deleteText +''; + if (options.deleteContainerClass) { + // If we have a specific container for the remove button, + // place it as the last child of that container: + row.find('[class*="' + options.deleteContainerClass + '"]').append(delButtonHTML); + } else if (row.is('TR')) { + // If the forms are laid out in table rows, insert + // the remove button into the last table cell: + row.children(':last').append(delButtonHTML); + } else if (row.is('UL') || row.is('OL')) { + // If they're laid out as an ordered/unordered list, + // insert an
*Για να διαγράψουμε προϊόντα επιλέγουμε τη διαγραφή σε όσα θέλουμε και πατάμε Αποθήκευση. ΔΕΝ πατάμε αφαίρεση. - -
*Για να διαγράψουμε προϊόντα επιλέγουμε τη διαγραφή σε όσα θέλουμε και πατάμε Αποθήκευση. ΔΕΝ πατάμε αφαίρεση. + + +