From 6c46d0a6ce1632fa5fb35ea0bb393bc2412ebfa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Ho=CC=88rler?= Date: Mon, 26 Feb 2018 19:56:45 +0100 Subject: [PATCH 01/28] add order --- django/didgeridoo/webshop/models.py | 3 + .../webshop/templates/webshop/checkout.html | 51 ++++--- .../webshop/templates/webshop/nav.html | 6 +- .../webshop/templates/webshop/orders.html | 8 + django/didgeridoo/webshop/urls.py | 3 + django/didgeridoo/webshop/views.py | 144 ++++++++---------- 6 files changed, 111 insertions(+), 104 deletions(-) create mode 100644 django/didgeridoo/webshop/templates/webshop/orders.html diff --git a/django/didgeridoo/webshop/models.py b/django/didgeridoo/webshop/models.py index 111f346..33c9106 100644 --- a/django/didgeridoo/webshop/models.py +++ b/django/didgeridoo/webshop/models.py @@ -86,6 +86,9 @@ class Order(models.Model): date = models.DateTimeField(default=timezone.now) exchange_rate = models.ForeignKey(ExchangeRate) + def __str__(self): + return str(self.id) + class OrderPosition(models.Model): """ Items in Submitted Orders""" diff --git a/django/didgeridoo/webshop/templates/webshop/checkout.html b/django/didgeridoo/webshop/templates/webshop/checkout.html index 0802077..a680d0d 100644 --- a/django/didgeridoo/webshop/templates/webshop/checkout.html +++ b/django/didgeridoo/webshop/templates/webshop/checkout.html @@ -2,6 +2,7 @@ {% block section_title %}

CHECKOUT

{% endblock %} {% block content %}

Preview your Purchase:

+

Shipping Address:

{% if person %}

Salutation: {{ person.salutation }}

@@ -17,48 +18,58 @@

{% endif %} - {% if articles_list %} -

Articles:

- + {% if cart_position_list %} +
+

Your Items:

+
- - + + - {% for article in articles_list %} + {% for cart_position in cart_position_list %} - - + + - - - + + - + {% endfor %} - +
POS. ART# NAME STOCK AMOUNTPRICE p.pce.POSITION PRICEPRICE p.pce.POSITION PRICE
{{ article.id }}{{ article.article.id }}{{ cart_position.id }}{{ cart_position.article.id }} - - {{ article.article.name }} + + {{ cart_position.article.name }} {{ article.article.stock }} - {{ article.amount }} - - {{ article.article.price_in_chf }} + {{ cart_position.article.stock }}{{ cart_position.article.amount }} + {{ cart_position.article.price_in_chf }} {{ currency_name }} {{ article.position_price }} {{ currency_name }} + {{ cart_position.position_price }} {{ currency_name }} +
- Total: {{ total }} {{ currency_name }} + + +
Total:
+
{{ total }} {{ currency_name }}
+
+ {% csrf_token %} + {{ checkout_form.as_p }} + +
{% else %}

- Something whent wrong. Your cart is empty. + Your cart seamed to lack Items. + Go get some in the store!

{% endif %} diff --git a/django/didgeridoo/webshop/templates/webshop/nav.html b/django/didgeridoo/webshop/templates/webshop/nav.html index f65151f..d43e0e3 100644 --- a/django/didgeridoo/webshop/templates/webshop/nav.html +++ b/django/didgeridoo/webshop/templates/webshop/nav.html @@ -13,6 +13,9 @@ {% else %}
  • LOGIN
  • {% endif %} + {% if checkout %} + + {% else %} diff --git a/django/didgeridoo/webshop/templates/webshop/orders.html b/django/didgeridoo/webshop/templates/webshop/orders.html new file mode 100644 index 0000000..220d4a5 --- /dev/null +++ b/django/didgeridoo/webshop/templates/webshop/orders.html @@ -0,0 +1,8 @@ +{% extends "webshop/base.html" %} +{% load customfilters %} +{% block section_title %}Order{% endblock %} + +{% block content %} +

    Your order was submitted.

    +

    Thank you for Purchase.

    +{% endblock %} diff --git a/django/didgeridoo/webshop/urls.py b/django/didgeridoo/webshop/urls.py index 090420d..1b041bd 100644 --- a/django/didgeridoo/webshop/urls.py +++ b/django/didgeridoo/webshop/urls.py @@ -23,4 +23,7 @@ urlpatterns = [ url(r'^cart/checkout/$', views.checkout, name='checkout'), + url(r'^orders$', + views.orders, + name='orders'), ] diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 58d1870..a7e7fd9 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -10,7 +10,8 @@ from webshop.models import (Article, City, Picture, CartPosition, - ShoppingCart) + ShoppingCart, + Order) from webshop.forms import (RegistrationForm, AddToCartForm, CartForm, @@ -83,7 +84,7 @@ def restrict_cart_to_one_article(user_id, article_id, amount, operation): if operation == 'add': new_amount = cart_position.amount + amount if operation == 'replace': - new_amount = amount # ref two times check later !! + new_amount = amount # if article is in cart already update amount: cart_position = CartPosition.objects.filter( article=article_id).update( @@ -280,11 +281,6 @@ def cart(request): currency, cart_position.article.price_in_chf ) - cart_position.position_price = rate.exchange( - currency, - cart_position.position_price - ) - amount_form = CartForm( initial={'amount_form': cart_position.amount} ) @@ -315,106 +311,88 @@ def checkout(request): amount_form = CartForm rate = ExchangeRate article_view = True - currency_name = "CHF" message = "" cart_position_list = [] - amount_form_list = [] totalprice_list = [] total = 0 - cart_position_list_zip = [] - # here we configure the users Currency: + + checkout_form = CheckoutForm() if 'currency' not in request.session: request.session['currency'] = None else: currency = request.session['currency'] + exchange_rate = ExchangeRate.objects.filter(name=currency).latest('date') # Here we handle all POST Operations: if request.method == 'POST': - # here we react to a currency dropdown change: - if 'currencies' in request.POST: - print('currencies') - currencies_form = CurrenciesForm(request.POST) - if currencies_form.is_valid(): - cf = currencies_form.cleaned_data - if cf['currencies']: - print('currencies cf:', cf) - selection = cf['currencies'] - request.session['currency'] = selection.id - currency_name = ExchangeRate_name.objects.get( - id=selection.id) - print('currencies currency_name:', currency_name) - else: - request.session['currency'] = None + print('checkout post') # here we react to a change of amount per item in the Cart: - if 'amount_form' in request.POST: - amount_form = CartForm(request.POST) - if amount_form.is_valid(): - amount = amount_form.cleaned_data['amount_form'] - article_id = request.POST.get('article_id') - operation = 'replace' - restrict_cart_to_one_article( - request.user.id, - article_id, - amount, - operation + if 'checkout_form' in request.POST: + print('checkout post request.POST = checkout_form') + checkout_form = CartForm(request.POST) + if checkout_form.is_valid(): + print('checkout post valid') + order, created_order = Order.objects.get_or_create( + user=request.user, + defaults={'status': 1, + 'exchange_rate': exchange_rate.id, + } ) - # here we react to a change of amount per item in the Cart: - if 'delete' in request.POST: - delete = CartForm(request.POST) - if delete.is_valid(): - amount = delete.cleaned_data['amount_form'] - article_id = request.POST.get('article_id') - amount = 1 - operation = 'delete' - restrict_cart_to_one_article( - request.user.id, - article_id, - amount, - operation - ) - # here we handle the normal cart view: - # if cart_id is not existent create a cart: - cart_id, created_cart = ShoppingCart.objects.get_or_create(user=request.user) - # get all items in the cart of this customer: - cart_positions = CartPosition.objects.filter(cart=cart_id) - if (cart_positions.count()) > 0: - # make a list out of all articles: - cart_position_list = list(cart_positions) - # enumerate the list of articles and loop over items: - for idx, cart_position in enumerate(cart_position_list): - # scrap out the details to calculate Total of item and Summ of All: - if currency: - # get currencyname to display: - currency_name = ExchangeRate_name.objects.get(id=currency) - # get exchange_rate multiplyed: - cart_position.price_in_chf = rate.exchange( - currency, - cart_position.article.price_in_chf - ) - totalprice_list.append(cart_position.price_in_chf) - amount_form = CartForm( - initial={'amount_form': cart_position.amount} - ) - amount_form_list.append(amount_form) - cart_position_list[idx] = cart_position - cart_position_list_zip = zip(cart_position_list, amount_form_list) + print('order', order, 'created:', created_order) + if created_order is False: + message = """something whent wrong. + Seams like this cart was already submitted. How come? """ + # order status variables: + # • ordered -> vom Kunden bestellt + #  • delivered -> Bestellung wurde versandt + # • cancelled -> Bestellung storniert + # • on hold -> Bestellung pausiert + cart_id, created_cart = ShoppingCart.objects.get_or_create( + user=request.user) + if created_cart is False: + # get all items in the cart of this customer: + cart_positions = CartPosition.objects.filter( + cart=cart_id) + if (cart_positions.count()) > 0: + # make a list out of all articles: + cart_position_list = list(cart_positions) + # enumerate the list of articles and loop over items: + for idx, cart_position in enumerate(cart_position_list): + if currency: + # get currencyname to display: + currency_name = ExchangeRate_name.objects.get(id=currency) + # get exchange_rate multiplyed: + cart_position.article.price_in_chf = rate.exchange( + currency, + cart_position.article.price_in_chf + ) + cart_position.calculate_position_price() + totalprice_list.append(cart_position.position_price) + cart_position_list[idx] = cart_position + else: + message = """something whent wrong. + Seams like your cart was + not existent before. How come? """ total = sum(totalprice_list) - - checkout_form = CheckoutForm() - registration_form = RegistrationForm() person = Person.objects.get(user=request.user.id) return render(request, 'webshop/checkout.html', - {'cart_position_list_zip': cart_position_list_zip, + {'cart_position_list': cart_position_list, 'totalprice_list': totalprice_list, 'total': total, 'currencies_form': currencies_form, 'amount_form': amount_form, 'checkout_form': checkout_form, - 'registration_form': registration_form, - 'article_view': article_view, 'currency_name': currency_name, + 'article_view': article_view, 'category_list': category_list, 'message': message, 'person': person }) + + +def orders(request): + return render(request, 'webshop/orders.html', + { + + }) From ffcf6e6ba53392e3d61caf0d9e4f9ef1d43f722c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Ho=CC=88rler?= Date: Mon, 26 Feb 2018 20:49:49 +0100 Subject: [PATCH 02/28] change orders to order and delete unused --- django/didgeridoo/webshop/templates/webshop/checkout.html | 2 +- django/didgeridoo/webshop/templates/webshop/nav.html | 4 ---- .../webshop/templates/webshop/{orders.html => order.html} | 1 - django/didgeridoo/webshop/urls.py | 6 +++--- django/didgeridoo/webshop/views.py | 4 ++-- 5 files changed, 6 insertions(+), 11 deletions(-) rename django/didgeridoo/webshop/templates/webshop/{orders.html => order.html} (99%) diff --git a/django/didgeridoo/webshop/templates/webshop/checkout.html b/django/didgeridoo/webshop/templates/webshop/checkout.html index a680d0d..e3a1da2 100644 --- a/django/didgeridoo/webshop/templates/webshop/checkout.html +++ b/django/didgeridoo/webshop/templates/webshop/checkout.html @@ -60,7 +60,7 @@ -
    + {% csrf_token %} {{ checkout_form.as_p }} diff --git a/django/didgeridoo/webshop/templates/webshop/nav.html b/django/didgeridoo/webshop/templates/webshop/nav.html index d43e0e3..6390f7b 100644 --- a/django/didgeridoo/webshop/templates/webshop/nav.html +++ b/django/didgeridoo/webshop/templates/webshop/nav.html @@ -13,9 +13,6 @@ {% else %}
  • LOGIN
  • {% endif %} - {% if checkout %} - - {% else %}
    {% endif %} - {% endif %} diff --git a/django/didgeridoo/webshop/templates/webshop/orders.html b/django/didgeridoo/webshop/templates/webshop/order.html similarity index 99% rename from django/didgeridoo/webshop/templates/webshop/orders.html rename to django/didgeridoo/webshop/templates/webshop/order.html index 220d4a5..1ffcde5 100644 --- a/django/didgeridoo/webshop/templates/webshop/orders.html +++ b/django/didgeridoo/webshop/templates/webshop/order.html @@ -1,7 +1,6 @@ {% extends "webshop/base.html" %} {% load customfilters %} {% block section_title %}Order{% endblock %} - {% block content %}

    Your order was submitted.

    Thank you for Purchase.

    diff --git a/django/didgeridoo/webshop/urls.py b/django/didgeridoo/webshop/urls.py index 1b041bd..2ae9641 100644 --- a/django/didgeridoo/webshop/urls.py +++ b/django/didgeridoo/webshop/urls.py @@ -23,7 +23,7 @@ urlpatterns = [ url(r'^cart/checkout/$', views.checkout, name='checkout'), - url(r'^orders$', - views.orders, - name='orders'), + url(r'^order/$', + views.order, + name='order'), ] diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index fb2c8a5..6eee0b8 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -313,7 +313,7 @@ def checkout(request): currencies_form = CurrenciesForm amount_form = CartForm rate = ExchangeRate - article_view = True + article_view = False message = "" cart_position_list = [] totalprice_list = [] @@ -394,7 +394,7 @@ def checkout(request): }) -def orders(request): +def order(request): return render(request, 'webshop/orders.html', { From 736c5d4ba35f7f16c1fa082a763577eb8aa24a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Ho=CC=88rler?= Date: Mon, 26 Feb 2018 20:56:18 +0100 Subject: [PATCH 03/28] fix url for order --- django/didgeridoo/webshop/templates/webshop/checkout.html | 2 +- django/didgeridoo/webshop/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/django/didgeridoo/webshop/templates/webshop/checkout.html b/django/didgeridoo/webshop/templates/webshop/checkout.html index e3a1da2..1dabb2b 100644 --- a/django/didgeridoo/webshop/templates/webshop/checkout.html +++ b/django/didgeridoo/webshop/templates/webshop/checkout.html @@ -60,7 +60,7 @@ -
    + {% csrf_token %} {{ checkout_form.as_p }} diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 6eee0b8..02a6af1 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -395,7 +395,7 @@ def checkout(request): def order(request): - return render(request, 'webshop/orders.html', + return render(request, 'webshop/order.html', { }) From 1be2249957e09825e2352d0aaff99b5642a4efa5 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 21:01:55 +0100 Subject: [PATCH 04/28] users must login to view their cart and to checkout --- django/didgeridoo/webshop/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 6eee0b8..bd274ee 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -195,6 +195,7 @@ def registration(request): 'user_form': user_form}) +@login_required def cart(request): category_list = get_categories() currencies_form = CurrenciesForm @@ -308,6 +309,7 @@ def cart(request): }) +@login_required def checkout(request): category_list = get_categories() currencies_form = CurrenciesForm From a389e641499b8fbe496a48581a6e4ce589c5614c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Ho=CC=88rler?= Date: Mon, 26 Feb 2018 21:22:07 +0100 Subject: [PATCH 05/28] fix order save to db --- django/didgeridoo/webshop/forms.py | 1 - .../webshop/templates/webshop/checkout.html | 2 +- django/didgeridoo/webshop/views.py | 19 ++++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/django/didgeridoo/webshop/forms.py b/django/didgeridoo/webshop/forms.py index e762e45..7aada1f 100644 --- a/django/didgeridoo/webshop/forms.py +++ b/django/didgeridoo/webshop/forms.py @@ -74,7 +74,6 @@ class CartForm(forms.Form): class CheckoutForm(forms.Form): - checkout = forms.BooleanField( required=True, label='Yes. I have read the General Terms and Conditions.') diff --git a/django/didgeridoo/webshop/templates/webshop/checkout.html b/django/didgeridoo/webshop/templates/webshop/checkout.html index 1dabb2b..f1cad54 100644 --- a/django/didgeridoo/webshop/templates/webshop/checkout.html +++ b/django/didgeridoo/webshop/templates/webshop/checkout.html @@ -60,7 +60,7 @@ - + {% csrf_token %} {{ checkout_form.as_p }} diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 7f047d9..f55a0fd 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -11,7 +11,8 @@ from webshop.models import (Article, Picture, CartPosition, ShoppingCart, - Order) + Order, + OrderStatus) from webshop.forms import (RegistrationForm, AddToCartForm, CartForm, @@ -329,17 +330,19 @@ def checkout(request): exchange_rate = ExchangeRate.objects.filter(name=currency).latest('date') # Here we handle all POST Operations: if request.method == 'POST': - print('checkout post') + print('checkout post', request.POST) # here we react to a change of amount per item in the Cart: - if 'checkout_form' in request.POST: + if 'checkout' in request.POST: print('checkout post request.POST = checkout_form') - checkout_form = CartForm(request.POST) + checkout_form = CheckoutForm(request.POST) if checkout_form.is_valid(): - print('checkout post valid') + orderstatus = OrderStatus.objects.get(name='ordered') + print('checkout post valid orderstatus', orderstatus, + 'exchange_rate_id:', exchange_rate_id) order, created_order = Order.objects.get_or_create( user=request.user, - defaults={'status': 1, - 'exchange_rate': exchange_rate.id, + defaults={'status': orderstatus, + 'exchange_rate': exchange_rate, } ) print('order', order, 'created:', created_order) @@ -385,8 +388,6 @@ def checkout(request): {'cart_position_list': cart_position_list, 'totalprice_list': totalprice_list, 'total': total, - 'currencies_form': currencies_form, - 'amount_form': amount_form, 'checkout_form': checkout_form, 'currency_name': currency_name, 'article_view': article_view, From ac7ae505e3a222f8ff4a2255bd43d19eeef3a87e Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 21:53:13 +0100 Subject: [PATCH 06/28] remove old code --- django/didgeridoo/webshop/views.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index f55a0fd..f07f88a 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -313,8 +313,6 @@ def cart(request): @login_required def checkout(request): category_list = get_categories() - currencies_form = CurrenciesForm - amount_form = CartForm rate = ExchangeRate article_view = False message = "" @@ -386,7 +384,6 @@ def checkout(request): return render(request, 'webshop/checkout.html', {'cart_position_list': cart_position_list, - 'totalprice_list': totalprice_list, 'total': total, 'checkout_form': checkout_form, 'currency_name': currency_name, From 691fdc12f564a6c0f1cf4078ebdbe47094234404 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 21:53:21 +0100 Subject: [PATCH 07/28] display the position amount correctly --- django/didgeridoo/webshop/templates/webshop/checkout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/templates/webshop/checkout.html b/django/didgeridoo/webshop/templates/webshop/checkout.html index f1cad54..2847e82 100644 --- a/django/didgeridoo/webshop/templates/webshop/checkout.html +++ b/django/didgeridoo/webshop/templates/webshop/checkout.html @@ -41,7 +41,7 @@ {{ cart_position.article.stock }} - {{ cart_position.article.amount }} + {{ cart_position.amount }} {{ cart_position.article.price_in_chf }} {{ currency_name }} From 3970555cf11dd05fd1be0a1d3843dc8a317cd0c9 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 21:54:11 +0100 Subject: [PATCH 08/28] shorten the line a bit --- django/didgeridoo/webshop/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index f07f88a..077e77e 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -325,7 +325,8 @@ def checkout(request): request.session['currency'] = None else: currency = request.session['currency'] - exchange_rate = ExchangeRate.objects.filter(name=currency).latest('date') + exchange_rate = rate.objects.filter(name=currency).latest('date') + # Here we handle all POST Operations: if request.method == 'POST': print('checkout post', request.POST) From f62a6a91d9b93dab97f4428492de304194ca52ff Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 21:54:40 +0100 Subject: [PATCH 09/28] only create the order --- django/didgeridoo/webshop/views.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 077e77e..7ef7f69 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -337,15 +337,12 @@ def checkout(request): if checkout_form.is_valid(): orderstatus = OrderStatus.objects.get(name='ordered') print('checkout post valid orderstatus', orderstatus, - 'exchange_rate_id:', exchange_rate_id) - order, created_order = Order.objects.get_or_create( - user=request.user, - defaults={'status': orderstatus, - 'exchange_rate': exchange_rate, - } - ) - print('order', order, 'created:', created_order) - if created_order is False: + 'exchange_rate:', exchange_rate) + order = Order.objects.create(user=request.user, + status=orderstatus, + exchange_rate=exchange_rate) + print('order', order, 'created:', order) + if order is False: message = """something whent wrong. Seams like this cart was already submitted. How come? """ # order status variables: From 494ce666314276681bc09a4a7a483be5fd7c05c5 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 21:55:15 +0100 Subject: [PATCH 10/28] only execute the currency part if it exists in the session --- django/didgeridoo/webshop/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 7ef7f69..b962d36 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -362,7 +362,7 @@ def checkout(request): cart_position_list = list(cart_positions) # enumerate the list of articles and loop over items: for idx, cart_position in enumerate(cart_position_list): - if currency: + if request.session['currency']: # get currencyname to display: currency_name = ExchangeRate_name.objects.get(id=currency) # get exchange_rate multiplyed: From db737eca02ebd25fa39b2cb89a78b72a4a96ae3c Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 21:55:38 +0100 Subject: [PATCH 11/28] only get the cart the cart was created in the cart view. In the checkout we only want to display it. --- django/didgeridoo/webshop/views.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index b962d36..8f0a5d6 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -351,12 +351,10 @@ def checkout(request): # • cancelled -> Bestellung storniert # • on hold -> Bestellung pausiert - cart_id, created_cart = ShoppingCart.objects.get_or_create( - user=request.user) - if created_cart is False: + cart = ShoppingCart.objects.get(user=request.user) + if cart: # get all items in the cart of this customer: - cart_positions = CartPosition.objects.filter( - cart=cart_id) + cart_positions = CartPosition.objects.filter(cart=cart) if (cart_positions.count()) > 0: # make a list out of all articles: cart_position_list = list(cart_positions) From d51e9dfa0828aba7111b99bac97136dc65c5d8ca Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 21:56:07 +0100 Subject: [PATCH 12/28] shorten the order view --- django/didgeridoo/webshop/views.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 8f0a5d6..d726a74 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -391,7 +391,4 @@ def checkout(request): def order(request): - return render(request, 'webshop/order.html', - { - - }) + return render(request, 'webshop/order.html', {}) From 45571b8ea94dc15b184eaf8c95a2ec3323bc6129 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:22:22 +0100 Subject: [PATCH 13/28] use CHF as the default currency_name --- django/didgeridoo/webshop/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index d726a74..8fc3c71 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -315,6 +315,7 @@ def checkout(request): category_list = get_categories() rate = ExchangeRate article_view = False + currency_name = "CHF" message = "" cart_position_list = [] totalprice_list = [] From 6c172405cad3a9a684b9a873c982ae200e676e4a Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:22:45 +0100 Subject: [PATCH 14/28] add the orderposition modell --- django/didgeridoo/webshop/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 8fc3c71..aa9fc4f 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -12,7 +12,8 @@ from webshop.models import (Article, CartPosition, ShoppingCart, Order, - OrderStatus) + OrderStatus, + OrderPosition) from webshop.forms import (RegistrationForm, AddToCartForm, CartForm, From a232ca414c1dcee1289c0617ea994e38b2019923 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:23:15 +0100 Subject: [PATCH 15/28] move the person up --- django/didgeridoo/webshop/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index aa9fc4f..eb8eb98 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -321,6 +321,7 @@ def checkout(request): cart_position_list = [] totalprice_list = [] total = 0 + person = Person.objects.get(user=request.user.id) checkout_form = CheckoutForm() if 'currency' not in request.session: @@ -378,7 +379,6 @@ def checkout(request): Seams like your cart was not existent before. How come? """ total = sum(totalprice_list) - person = Person.objects.get(user=request.user.id) return render(request, 'webshop/checkout.html', {'cart_position_list': cart_position_list, From 865ff557bdefebb4769a03073620283454a6636a Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:23:29 +0100 Subject: [PATCH 16/28] add some empty lines for readability --- django/didgeridoo/webshop/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index eb8eb98..3f91c41 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -374,10 +374,12 @@ def checkout(request): cart_position.calculate_position_price() totalprice_list.append(cart_position.position_price) cart_position_list[idx] = cart_position + else: message = """something whent wrong. Seams like your cart was not existent before. How come? """ + total = sum(totalprice_list) return render(request, 'webshop/checkout.html', From b9d2d9f6aea5d3b3bce79338057e8afae5beb90e Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:24:01 +0100 Subject: [PATCH 17/28] only query the exchange_rate if the currency was set --- django/didgeridoo/webshop/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 3f91c41..3cca0d6 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -328,7 +328,6 @@ def checkout(request): request.session['currency'] = None else: currency = request.session['currency'] - exchange_rate = rate.objects.filter(name=currency).latest('date') # Here we handle all POST Operations: if request.method == 'POST': @@ -353,6 +352,8 @@ def checkout(request): #  • delivered -> Bestellung wurde versandt # • cancelled -> Bestellung storniert # • on hold -> Bestellung pausiert + if currency: + exchange_rate = rate.objects.filter(name=currency).latest('date') cart = ShoppingCart.objects.get(user=request.user) if cart: From 9b0fc0ba069669dbdd63529329ad242495f7bf84 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:31:37 +0100 Subject: [PATCH 18/28] allow the ExchangeRate to be null If we buy the article in CHF there is no ExchangeRate object --- django/didgeridoo/webshop/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/models.py b/django/didgeridoo/webshop/models.py index 33c9106..87b3b4c 100644 --- a/django/didgeridoo/webshop/models.py +++ b/django/didgeridoo/webshop/models.py @@ -84,7 +84,7 @@ class Order(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) status = models.ForeignKey(OrderStatus) date = models.DateTimeField(default=timezone.now) - exchange_rate = models.ForeignKey(ExchangeRate) + exchange_rate = models.ForeignKey(ExchangeRate, null=True) def __str__(self): return str(self.id) From 3073baf43fb21933966fde5761f13d91b68eb10b Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:32:21 +0100 Subject: [PATCH 19/28] remove the person variable --- django/didgeridoo/webshop/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 3cca0d6..04e4fea 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -180,7 +180,7 @@ def registration(request): user.last_name = pf['last_name'] user.first_name = pf['first_name'] user.save() - person = Person.objects.create( + Person.objects.create( salutation=pf['salutation'], city=City.objects.get(zip_code=pf['zip_code'], name=pf['city']), From 29689fd16adccefdcf67f40ccc3435c763f548b9 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:32:46 +0100 Subject: [PATCH 20/28] set the exchange_rate variable to False initially Since we start with CHF by default the exchange_rate variable should be False --- django/didgeridoo/webshop/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 04e4fea..8a9b395 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -317,6 +317,7 @@ def checkout(request): rate = ExchangeRate article_view = False currency_name = "CHF" + exchange_rate = False message = "" cart_position_list = [] totalprice_list = [] From ba61ed12a6363b31ee83bd9936a9234b90cf1a4d Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:33:29 +0100 Subject: [PATCH 21/28] move the post block below the cart operation --- django/didgeridoo/webshop/views.py | 50 ++++++++++++++++-------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 8a9b395..8f9cff4 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -330,29 +330,6 @@ def checkout(request): else: currency = request.session['currency'] - # Here we handle all POST Operations: - if request.method == 'POST': - print('checkout post', request.POST) - # here we react to a change of amount per item in the Cart: - if 'checkout' in request.POST: - print('checkout post request.POST = checkout_form') - checkout_form = CheckoutForm(request.POST) - if checkout_form.is_valid(): - orderstatus = OrderStatus.objects.get(name='ordered') - print('checkout post valid orderstatus', orderstatus, - 'exchange_rate:', exchange_rate) - order = Order.objects.create(user=request.user, - status=orderstatus, - exchange_rate=exchange_rate) - print('order', order, 'created:', order) - if order is False: - message = """something whent wrong. - Seams like this cart was already submitted. How come? """ - # order status variables: - # • ordered -> vom Kunden bestellt - #  • delivered -> Bestellung wurde versandt - # • cancelled -> Bestellung storniert - # • on hold -> Bestellung pausiert if currency: exchange_rate = rate.objects.filter(name=currency).latest('date') @@ -384,6 +361,33 @@ def checkout(request): total = sum(totalprice_list) + # Here we handle all POST Operations: + if request.method == 'POST': + print('checkout post', request.POST) + # here we react to a change of amount per item in the Cart: + if 'checkout' in request.POST: + print('checkout post request.POST = checkout_form') + checkout_form = CheckoutForm(request.POST) + if checkout_form.is_valid(): + orderstatus = OrderStatus.objects.get(name='ordered') + if exchange_rate: + order = Order.objects.create(user=request.user, + status=orderstatus, + exchange_rate=exchange_rate) + else: + order = Order.objects.create(user=request.user, + status=orderstatus) + + print('order', order, 'created:', order) + for position in cart_positions: + OrderPosition.objects.create( + position.article, + order, + position.amount, + position.article.price_in_chf + ) + ShoppingCart.objects.delete(pk=cart.id) + return render(request, 'webshop/checkout.html', {'cart_position_list': cart_position_list, 'total': total, From ee4d332a3bcac210b02630ca9e8b66efe50d61b1 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:44:36 +0100 Subject: [PATCH 22/28] fix the OrderPosition creation --- django/didgeridoo/webshop/views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 8f9cff4..fa11b38 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -381,10 +381,10 @@ def checkout(request): print('order', order, 'created:', order) for position in cart_positions: OrderPosition.objects.create( - position.article, - order, - position.amount, - position.article.price_in_chf + article=position.article, + order=order, + amount=position.amount, + price_in_chf=position.article.price_in_chf ) ShoppingCart.objects.delete(pk=cart.id) From 91d6b2b4d4c6bc3f172382856479b0235d02fadf Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:44:47 +0100 Subject: [PATCH 23/28] fix the cart deletion --- django/didgeridoo/webshop/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index fa11b38..ec2ee13 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -386,7 +386,8 @@ def checkout(request): amount=position.amount, price_in_chf=position.article.price_in_chf ) - ShoppingCart.objects.delete(pk=cart.id) + cart.delete() + cart = False return render(request, 'webshop/checkout.html', {'cart_position_list': cart_position_list, From a1e74a32c2c44e5c1265d2ff2543e617a4cef3d1 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Mon, 26 Feb 2018 22:51:43 +0100 Subject: [PATCH 24/28] readd the order url somehow this got lost --- django/didgeridoo/webshop/templates/webshop/checkout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/templates/webshop/checkout.html b/django/didgeridoo/webshop/templates/webshop/checkout.html index 2847e82..67849ba 100644 --- a/django/didgeridoo/webshop/templates/webshop/checkout.html +++ b/django/didgeridoo/webshop/templates/webshop/checkout.html @@ -60,7 +60,7 @@ - + {% csrf_token %} {{ checkout_form.as_p }} From d0c5cd68933cc64128d3c30b3b27af890359432b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Ho=CC=88rler?= Date: Mon, 26 Feb 2018 23:12:44 +0100 Subject: [PATCH 25/28] correct the doc.org and main.tex --- docs/doku.org | 359 +++++++++++++++++++++++++------------------------- docs/main.tex | 4 +- 2 files changed, 182 insertions(+), 181 deletions(-) diff --git a/docs/doku.org b/docs/doku.org index c65a0cc..39347be 100644 --- a/docs/doku.org +++ b/docs/doku.org @@ -24,11 +24,12 @@ Lustigste entschieden. - Barewahre-Shop - *Didgeridoo-Shop* -Aufgrund des eher lustigen Namens dieses Instruments haben wir uns +Aufgrund des eher lustigen Namens dieses Instruments, haben wir uns entschieden diesen Titel zu verwenden. Die Ursprünge des Instruments -liegen 2000 Jahre, sagen die Forscher – 40.000 Jahre, sagen die -Aborigines zurück. +liegen weit zurück. Die Forscher sagen bis zu 2000 Jahre, und die +Aborigines sogar bis 40.000 Jahre. +Zitat: …Als das Traumzeitvolk die Erde verliess, hinterliess es den Menschen ein Geschenk: Ein Horn, das ein Klangfeld zwischen ihrer Welt und unserer erzeugt…\footcite{didgeridoo} @@ -65,7 +66,7 @@ zur Verfügung stehende Zeit ist pro Student mit 80h zu veranschlagen. Am Ende dieser Zeitspanne soll ein funktionaler Web-Shop mit minimalem graphischen User Interface entstehen, die dazugehörige Dokumentation umfasst alle Aspekte um die gewählte Lösung nachzuvollziehen. -Die Projekt wurden in der Tabelle: ([[tab:projektziele]]) zusätzlich noch +Die Projekte wurden in der Tabelle: ([[tab:projektziele]]) zusätzlich noch nach Prioritäten gewichtet. #+CAPTION: Projektziele @@ -92,12 +93,12 @@ nach Prioritäten gewichtet. ** Methoden -Die Methodik die, die Gruppe wählt ist Aufgrund der nur zwei Personen -im Team beschränkt. Da jedoch Fehler und Rückschläge erwartet werden +Die Methodik, die die Gruppe wählt, ist aufgrund der nur zwei Personen +im Team beschränkt. Da jedoch Fehler und Rückschläge erwartet werden, ist eine iterative Methodik unabdingbar. Daher wandte die Gruppe eine angepasste Version von Scrum an. In dieser wird jeweils während Sitzungen die Position des Product Owners und des Scrum Masters -eingenommen und die Backlog-Tasks dementsprechend erstellt resp. +eingenommen und die Backlog-Tasks dementsprechend erstellt, resp. verteilt. Während der Woche arbeiten beide Team-Mitglieder an der Arbeit als Team-Kollegen @@ -105,13 +106,13 @@ Arbeit als Team-Kollegen Die benötigten Vorkenntnisse wurden in den vorangegangenen Semestern erarbeitet und sind in der Basis gefestigt. Diese Arbeit wird -vorwiegend weiterführende Elemente wie Frameworks neu einbringen deren +vorwiegend weiterführende Elemente wie Frameworks neu einbringen, deren Verhalten letztendlich nicht abgeschätzt werden kann. ** Vision Wir wollen einen Web-Shop mit geeigneter Software erstellen. Dabei -setzen wir nur freie Software ein (frei im Bezug auf Freiheit nicht +setzen wir nur freie Software ein (frei, in Bezug auf Freiheit, nicht Preis). Wir untersuchen die Anforderung und wählen die uns als geeignet erscheinenden Frameworks. Jede noch so kleine Zeiteinsparung durch vorgefertigte Entwicklungen werden angenommen und dennoch wollen @@ -193,7 +194,7 @@ Tabelle:([[tab:swot]]) zu sehen. ] at (SWOT-2-2) { % Interne Stärken/Externe Chancen feld: \begin{itemize} \item Know-How in Webtechnologien. - \item Quell offene Software ist leichter zu unterhalten. + \item Quelloffene Software ist leichter zu unterhalten. \item durch Verwendung des Frameworks kann die Entwicklungszeit stark reduziert werden. \item Wir als Programmierer haben ein gutes Know-How @@ -207,13 +208,13 @@ Tabelle:([[tab:swot]]) zu sehen. \begin{itemize} \item Das Framework ist nicht vollkommen. Teile davon müssten eventuell selber konzipiert/erarbeitet werden. - Welche Teile das sind ist noch nicht ersichtlich. - Durch die Quell offene Lizenz kann dies dem Projekt jedoch - einen Mehrwert geben, in dem diese Teile wiederverwendet + Welche Teile, das sind ist noch nicht ersichtlich. + Durch die Quelloffene Lizenz kann dies dem Projekt jedoch + einen Mehrwert geben, indem diese Teile wiederverwendet werden können. - \item Der Kunde vertraut uns, und die Beziehung ist gut. + \item Der Kunde vertraut uns und die Beziehung ist gut. Diese Ausgangslage mag helfen interne Schwächen durch - offene Kommunikation übergehen. + offene Kommunikation zu übergehen. \end{itemize} }; \node[ @@ -221,10 +222,10 @@ Tabelle:([[tab:swot]]) zu sehen. anchor=center ] at (SWOT-3-2) { % Interne Stärken/ Externe Risiken feld: \begin{itemize} - \item Quell offene Software kann unkontrolliert kopiert werden. - \item Die Implementation von Währungsänderungen ist + \item Quelloffene Software kann unkontrolliert kopiert werden. + \item Die Implementierung von Währungsänderungen ist nicht trivial. Der Zeitpunkt zu dem die Kosten - eines Produktes sich ändert muss gut durchdacht werden. + eines Produktes sich ändert, muss gut durchdacht werden. \end{itemize} }; \node[ @@ -233,7 +234,7 @@ Tabelle:([[tab:swot]]) zu sehen. ] at (SWOT-3-3) { % Interne Schwächen/ Externe Risiken feld: \begin{itemize} \item Wir als Programmierer haben keine Erfahrung im - Konsumsegment unseres Nutzers.. + Konsumsegment unseres Nutzers. \item Die Umsetzung der graphischen Anwendungsoberfläche könnte sich als schwierig erweisen. \item Die Umsetzungszeit ist knapp bemessen. @@ -261,23 +262,23 @@ Abbildung:([[fig:umweltgrafik]]) grafisch dargestellt. #+CAPTION: Umwelt-Analyse #+ATTR_LATEX: :align |>{\columncolor[HTML]{EFEFEF}}p{0.8cm}|l|l|p{8cm}|l| #+NAME: tab:umweltanalyse -|-------+----------------------+----------------------+-----------------------------------------------+---------------------------------------------| -| <5> | <20> | <20> | | | +|-------+----------------------+----------------------+-----------------------------------------------+----------------------------------------------| +| <5> | <20> | <20> | | | | *Nr*.\cellcolor[HTML]{C0C0C0} | *Stakeholder*\cellcolor[HTML]{C0C0C0} | *Einfluss*\cellcolor[HTML]{C0C0C0} | *Anforderung/Wünsche*\cellcolor[HTML]{C0C0C0} | *Wahrscheinlichkeit*\cellcolor[HTML]{C0C0C0} | -|-------+----------------------+----------------------+-----------------------------------------------+---------------------------------------------| -| 1. | Auftraggeber | hoch | - Innovatives Produkt auf dem Markt anbieten. | hoch | -| | | | - Einhaltung von Terminen und Qualität. | hoch | -|-------+----------------------+----------------------+-----------------------------------------------+---------------------------------------------| -| 2. | Kunden | gering | - Einfache Lösung die anpassungsfähig ist. | hoch | -| | | | - Schnell anfangen können. | hoch | -| | | | - Viele Arbeitsschritte Automatisieren | mittel | -|-------+----------------------+----------------------+-----------------------------------------------+---------------------------------------------| -| 3. | Interessenten | gering | - Intuitiv bedienbare Webseite | hoch | -| | | | - schnell finden was gesucht wird. | hoch | -|-------+----------------------+----------------------+-----------------------------------------------+---------------------------------------------| -| 4. | Projektleiter | hoch | - Gutes Innovatives Produkt erschaffen. | mittel | -| | | | - Anerkennung im fachlichen Umfeld | hoch | -|-------+----------------------+----------------------+-----------------------------------------------+---------------------------------------------| +|-------+----------------------+----------------------+-----------------------------------------------+----------------------------------------------| +| 1. | Auftraggeber | hoch | - Innovatives Produkt auf dem Markt anbieten. | hoch | +| | | | - Einhaltung von Terminen und Qualität. | hoch | +|-------+----------------------+----------------------+-----------------------------------------------+----------------------------------------------| +| 2. | Kunden | gering | - Einfache Lösung die anpassungsfähig ist. | hoch | +| | | | - Schnell anfangen können. | hoch | +| | | | - Viele Arbeitsschritte automatisieren | mittel | +|-------+----------------------+----------------------+-----------------------------------------------+----------------------------------------------| +| 3. | Interessenten | gering | - Intuitiv bedienbare Webseite | hoch | +| | | | - schnell finden, was gesucht wird. | hoch | +|-------+----------------------+----------------------+-----------------------------------------------+----------------------------------------------| +| 4. | Projektleiter | hoch | - Gutes innovatives Produkt erschaffen. | mittel | +| | | | - Anerkennung im fachlichen Umfeld | hoch | +|-------+----------------------+----------------------+-----------------------------------------------+----------------------------------------------| #+LATEX:\end{landscape} #+CAPTION: Stakeholder Diagramm @@ -295,15 +296,15 @@ Abbildung:([[fig:umweltgrafik]]) grafisch dargestellt. | <10> | <30> | <30> | | | | *Nr.*\cellcolor[HTML]{C0C0C0} | *Beschreibung*\cellcolor[HTML]{C0C0C0} | *Massnahmen*\cellcolor[HTML]{C0C0C0} | *W^1*\cellcolor[HTML]{C0C0C0} | *A^2*\cellcolor[HTML]{C0C0C0} | |------------+--------------------------------+--------------------------------+-------------------------------+-------------------------------| -| 1. | Die Datenbank ist schlecht modelliert | Das ERM nach dessen Erstellung gründlich auf Fehler prüfen, falls nötig extern prüfen lassen. | 2 | 3 | +| 1. | Die Datenbank ist schlecht modelliert | Das ERM, nach dessen Erstellung, gründlich auf Fehler prüfen, falls nötig extern prüfen lassen. | 2 | 3 | |------------+--------------------------------+--------------------------------+-------------------------------+-------------------------------| -| 2. | Viel Arbeit an der Arbeitsstelle, dabei bleibt weniger Zeit für die Casestudy. | Die Zeit die einem zur Verfügung steht nutzen und fixe Tage definieren. Projektplanung machen. | 1 | 2 | +| 2. | Viel Arbeit an der Arbeitsstelle, dabei bleibt weniger Zeit für die Casestudy. | Die Zeit die einem zur Verfügung steht, nutzen und fixe Tage definieren. Projektplanung machen. | 1 | 2 | |------------+--------------------------------+--------------------------------+-------------------------------+-------------------------------| -| 3. | Know-How zur Umsetzung ist nicht vollständig vorhanden. | Gute Informationsbeschaffung im Internet, Mitschülern, Arbeitgeber, Dozenten etc. | 2 | 2 | +| 3. | Know-How zur Umsetzung ist nicht vollständig vorhanden. | Gute Informationsbeschaffung im Internet, Mitschülern, Arbeitgebern, Dozenten etc. | 2 | 2 | |------------+--------------------------------+--------------------------------+-------------------------------+-------------------------------| -| 4. | Kommunikation innerhalb des Teams. | Klare Arbeitsaufteilung innerhalb des Teams und alle 2 Wochen Besprechungen über offene Aufgaben oder Problembehandlungen | 1 | 1 | +| 4. | Kommunikation innerhalb des Teams. | Klare Arbeitsaufteilung innerhalb des Teams und alle 2 Wochen Besprechungen über offene Aufgaben oder Problembehandlungen. | 1 | 1 | |------------+--------------------------------+--------------------------------+-------------------------------+-------------------------------| -| 5. | Die Programmierung des Shops benötigt zu viel Zeit | Bei der Projektplanung genau definieren was die GUI Applikation beinhalten muss. Ziele definieren, Abgrenzungen treffen. | 3 | 1 | +| 5. | Die Programmierung des Shops benötigt zu viel Zeit. | Bei der Projektplanung genau definieren was die GUI Applikation beinhalten muss. Ziele definieren, Abgrenzungen treffen. | 3 | 1 | |------------+--------------------------------+--------------------------------+-------------------------------+-------------------------------| *** Risikobewertung @@ -312,7 +313,7 @@ Abbildung:([[fig:umweltgrafik]]) grafisch dargestellt. #+ATTR_LATEX: :align l|l :placement [H] #+NAME: tab:wahrscheinlichkeit | *Bewertung* | *Beschreibung: Wahrscheinlichkeit (W)* | -|-------------+---------------------------------------| +|-------------+----------------------------------------| | 1 = gering | Unwahrscheinlich, <20% | | 2 = mittel | Mässig wahrscheinlich, 20-50% | | 3 = hoch | Hohe Wahrscheinlichkeit > 50% | @@ -333,7 +334,7 @@ Abbildung:([[fig:umweltgrafik]]) grafisch dargestellt. ** TODO Projektabgrenzung -Am ende des Projekts die nicht lauffähigen teile ausgrenzen. :-) +Am Ende des Projekts die nicht lauffähigen Teile ausgrenzen. :-) * Projektmanagement ** Organigramm @@ -373,8 +374,8 @@ Am ende des Projekts die nicht lauffähigen teile ausgrenzen. :-) ** Projektstrukturplan ** Varianten -Wir haben uns 3 mögliche Varianten überlegt im Bezug auf die zu -verwendende Software. Die Varianten wurden bewertet und die Variante +Wir haben uns 3 mögliche Varianten in Bezug auf die zu +verwendende Software überlegt. Die Varianten wurden bewertet und die Variante mit den meisten Punkten dann schlussendlich ausgewählt. Bei jeder Variante wurden die gleichen Kriterien mit der gleichen Gewichtung bewertet. Die Punktzahl pro Kriterium wird nach der @@ -390,14 +391,14 @@ Punktzahl(/EP/) ergibt das Kriteriumsergebnis(/KE/). *** ASP.NET und SQL Server ASP.NET und SQL Server, Tabelle:([[tab:asp-net]]), haben vor allem viele -Punkte verloren da C# nur in Teilen und SQL Server gar nicht unter +Punkte verloren, da C# nur in Teilen und SQL Server gar nicht unter einer freien Lizenz steht. Des weiteren läuft .NET Core zwar auch auf -Unix Systemen allerdings ist das verhältnismässig ein relativ kleiner +Unix Systemen, allerdings ist das verhältnismässig ein relativ kleiner Teil der gesamten Sprache. SQL Server läuft hingegen nur unter Windows und Linux. Des weiteren ist es sehr schwierig C# Applikationen ohne Visual Studio zu entwickeln. Es geht in der Theorie, in der Praxis ist es jedoch eher umständlich. Die Vorkenntnisse wurden mit 6 von 10 -Punkten bewertet da wir C# zwar im Rahmen der Ausbildung lernen, +Punkten bewertet, da wir C# zwar im Rahmen der Ausbildung lernen, allerdings noch nicht das Gefühl haben sonderlich gut mit C# umgehen zu können. @@ -423,18 +424,18 @@ zu können. *** PHP und MySQL -Die Variante PHP und MySQL, Tabelle:([[tab:php]]), hat insgesamt ein sehr +Die Variante PHP und MySQL, Tabelle:([[tab:php]]), hat insgesamt eine sehr gute Bewertung erhalten. Beide Projekte sind zumindest teilweise unter einer freien Lizenz verfügbar und sind sowohl unter Windows, wie auch Mac und Linux einsetzbar. Allerdings gibt es von MySQL noch eine -proprietäre Enterprise Variante weshalb wir hier nicht die volle +proprietäre Enterprise Variante, weshalb wir hier nicht die volle Punktzahl vergeben konnten. Abstriche gab es bei der Lesbarkeit des Codes. Da PHP insgesamt eine ziemlich inkonsistente und ausschweifende Sprache ist. Dafür ist das Setup sehr einfach und man kann eine PHP basierte Applikation ohne spezielle Werkzeuge entwickeln. Da wir -jedoch bereits sehr intensiv mit PHP und MySQL in Berührung kamen haben +jedoch bereits sehr intensiv mit PHP und MySQL in Berührung kamen, haben wir beim Lernfaktor Abstriche gemacht. In Zusammenhang mit einem -Framework hätten wir sicher auch viel dazugelernt im Vergleich zu den +Framework hätten wir sicher auch viel dazugelernt. Im Vergleich zu den anderen Varianten jedoch auf jeden Fall weniger. #+CAPTION: Bewertung der Variante PHP und MySQL @@ -462,12 +463,12 @@ anderen Varianten jedoch auf jeden Fall weniger. Diese Variante, Tabelle:([[tab:django]]), hat am meisten Punkte erhalten. Wie bei der Variante "PHP und MySQL" sind auch hier beide Komponenten freie Software. Im Gegensatz zu der vorherigen Variante gibt es bei -diesen Komponenten nur eine mögliche Lizenz Form. Womit sie die volle +diesen Komponenten nur eine mögliche Lizenzform. Womit sie die volle Punktzahl in dieser Kategorie erreichten. Beide Projekte laufen unter Windows, Linux sowie Mac. Wobei das Setup -unter für Django(Python) unter Windows etwas komplizierter ausfällt -als wir gerne hätten weshalb wir hier bei der Cross Plattform +für Django(Python) unter Windows etwas komplizierter ausfällt +als wir gerne hätten, weshalb wir hier bei der Cross Plattform Kompatibilität und dem Setup einen Abstrich gemacht haben. Python kann ohne spezielle Tools programmiert werden und gilt als eine der Sprachen mit der leserlichsten Syntax. Die Vorkenntnisse haben wir hier @@ -496,11 +497,11 @@ als eher niedrig eingestuft dafür den Lernfaktor umso höher. *** Ergebnis Aufgrund der erreichten Punktzahl, Tabelle:([[tab:result]]), bei den -vorhergehenden Variantenbewertungen haben wir uns dafür entschieden +vorhergehenden Variantenbewertungen, haben wir uns dafür entschieden, die Variante "Django(Python) und MariaDB" umzusetzen. In der Sektion -[[Werkzeuge]] beschreiben wir noch die weiteren Mittel welche beim -Erstellen der Case Study verwendet wurden und erklären wenn möglich -auch weshalb wir uns dafür entschieden haben. +[[Werkzeuge]] beschreiben wir noch die weiteren Mittel, welche beim +Erstellen der Case Study verwendet wurden und erklären, wenn möglich +auch, weshalb wir uns dafür entschieden haben. #+CAPTION: Variantenbewertung Ergebnis #+ATTR_LATEX: :align |>{\columncolor[HTML]{EFEFEF}}p{4.5cm}|r| @@ -526,10 +527,10 @@ Web-Shop an sich sondern generell für alle Tasks im Projekt. *** Versionskontrolle -Eine Versionskontrollsoftware erschien uns als notwendig um den Code +Eine Versionskontrollsoftware erschien uns als notwendig, um den Code auf einfache und zuverlässige Weise untereinander austauschen zu können. Andere Lösungen wie Dropbox, etc. hätten es uns nicht erlaubt -Konflikte zu vermeiden +Konflikte zu vermeiden. Als Software für die Versionskontrolle wurde Git \footcite{git} gewählt. Git wurde aus diversen Gründen gewählt: @@ -539,7 +540,7 @@ Git wurde aus diversen Gründen gewählt: - Es gäbe gratis Services die man nutzen könnte (Github, Gitlab) - Man kann offline arbeiten und Commits erstellen - Das Team hat bereits einen eigenen Git Server zur Verfügung -- Das Team ist bereits mit Git aus vorhergehenden Projekten vertraut +- Das Team ist bereits mit Git aus vorhergehenden Projekten vertraut, dadurch muss man keine Ressourcen aufwenden eine neue Software zu lernen. Zusätzlich hat sich Git in den vorhergehenden Projekten als robuste und schnelle Software erwiesen. @@ -547,25 +548,25 @@ Git wurde aus diversen Gründen gewählt: *** Entwicklungsumgebung -Damit beide Studenten auf der gleichen Basis arbeiten haben wir uns -dazu entschieden den Web-Shop in einer virtuellen Maschine zu +Damit beide Studenten auf der gleichen Basis arbeiten, haben wir uns +dazu entschieden, den Web-Shop in einer virtuellen Maschine zu entwickeln. Dies führt jedoch in der Regel zum Problem, dass die Änderungen in der virtuellen Maschine miteinander abgesprochen und -ausgetauscht werden müssen. Um dieses Problem zu beheben haben wir uns +ausgetauscht werden müssen. Um dieses Problem zu beheben, haben wir uns dazu entschieden Vagrant\footcite{vagrant} zu verwenden. Vagrant ist freie Software unter der MIT Lizenz. Vagrant erlaubt es einem den Zustand einer virtuellen Maschine in einer Text Datei zu beschreiben und diese dann gemäss der Beschreibung -automatisiert aufzusetzen. Dies hat den Vorteil das die Konfiguration +automatisiert aufzusetzen. Dies hat den Vorteil, dass die Konfiguration der virtuellen Maschine auch ohne Weiteres mit dem restlichen Code in der Versionskontrollsoftware gepflegt werden kann. Des weiteren hilft das automatisierte Aufsetzen, das Vermeiden von -menschlichen Fehlern. Somit kann davon ausgegangen werden dass, das +menschlichen Fehlern. Somit kann davon ausgegangen werden, dass das System in der virtuellen Maschine immer den korrekten Stand zum -Entwickeln hat. Sollte dies nicht mehr der Fall sein lässt sich die -virtuelle Maschine mit einem maximal zwei Befehlen wieder in den +Entwickeln hat. Sollte dies nicht mehr der Fall sein, lässt sich die +virtuelle Maschine mit einem, maximal zwei Befehlen wieder in den Ursprungszustand zurücksetzen. Als Hypervisor der virtuellen Maschine wurde @@ -581,7 +582,7 @@ Debian\footcite{debian} in der Version 9 (Stretch) gewählt. Für Debian haben wir uns vor allem aus folgenden Gründen entschieden: - Stabiles Betriebsystem -- Sehr guter Paketmanager was einem das Scripting vereinfacht +- Sehr guter Paketmanager, was einem das Scripting vereinfacht - Gilt als sehr sicher - Hat sich in vorhergehenden Projekten bereits als gute Basis bewiesen - Enthält in der Grundkonfiguration nur freie Software (nicht freie @@ -592,20 +593,20 @@ haben wir uns vor allem aus folgenden Gründen entschieden: *** Deployment Software für Produktionsserver Auch auf dem produktiven Server haben wir uns für Debian entschieden. -Um diesen aufzusetzen hatten wir in etwa die ähnlichen Anforderungen +Um diesen aufzusetzen, hatten wir in etwa die ähnlichen Anforderungen wie für die Entwicklungsumgebung. Also einen Weg um das System möglichst automatisch und reproduzierbar aufzusetzen. Die für die Entwicklungsumgebung verwendete Software Vagrant ist für produktive -System allerdings eher weniger geeignet. +Systeme allerdings eher weniger geeignet. Für solche Fälle bietet sich eine Software Namens -"Ansible"\footcite{ansible} an. Diese bietet einem ähnlich wie Vagrant -die Möglichkeit den Zustand eines Systems in Text Dateien zu +"Ansible"\footcite{ansible} an. Diese bietet einem, ähnlich wie Vagrant, +die Möglichkeit, den Zustand eines Systems in Textdateien zu beschreiben. Allerdings bietet einem Ansible noch zusätzliche -Möglichkeiten und vor allem ein standardisiertes Interface um -unterschiedliche Systeme auf die selbe Weise zu konfigurieren. +Möglichkeiten und vor allem ein standardisiertes Interface, um +unterschiedliche Systeme auf dieselbe Weise zu konfigurieren. -Der Vorteil gegenüber anderen System ist das Ansible mit sehr +Der Vorteil gegenüber anderen System ist, dass Ansible mit sehr wenig Abhängigkeiten für das zu konfigurierende System daherkommt. Auf einem Linux System ist nur SSH Zugriff und Python notwendig. Einen Client braucht man nicht zu installieren. @@ -613,11 +614,11 @@ Ansible ist freie Software unter der GNU Public License v3. *** Framework -Um die Entwicklung der Applikation zu vereinfachen haben wir uns dazu +Um die Entwicklung der Applikation zu vereinfachen, haben wir uns dazu entschlossen ein Framework einzusetzen. Frameworks bringen einem in der Entwicklung diverse Vorteile. Unter anderem bieten sie Hilfen bei sich wiederholenden Programmieraufgaben und bieten je nachdem die -Möglichkeit die Applikation in einer einzigen Sprache zu schreiben da +Möglichkeit, die Applikation in einer einzigen Sprache zu schreiben, da sich das Framework auch um die Datenbank kümmert. In der Webentwicklung helfen sie einem insbesondere auch dabei Sicherheitslücken wie Cross Site Scripting und SQL Injections @@ -630,8 +631,8 @@ folgenden Gründen für ein Python basiertes Framework gegenüber einem PHP basierten Framework entschieden: - Python gilt als die Sprache mit der schöneren Syntax. -- Wir wollten im Bezug auf das Programmieren etwas neues ausprobieren - was sich im Rahmen einer Case Study sehr gut machen lässt. Da man +- Wir wollten im Bezug auf das Programmieren etwas Neues ausprobieren + was sich im Rahmen einer Case Study sehr gut machen lässt, da man ein "realistisches" Szenarium erhält und dieses in einem relativ kontrollierten Rahmen ausführen kann. - Python ist in dem von uns gewählten Hostsystem wie in den meisten @@ -644,7 +645,7 @@ Die verwendete Version war dabei 1.10.7-2 aus dem Debian Stretch Repository. *** Webserver Als Webserver verwenden wir ganz klassisch Apache\footcite{apache}. -Dies vor allem aus dem Grund das wir Apache aus diversen vorhergehenden +Dies vor allem desswegen weil wir Apache aus diversen vorhergehenden Projekten bereits sehr gut kennen und sich der Webserver dort sehr gut bewährt hat. Apache wird dabei auch noch gut von Django unterstützt. Der Apache Webserver ist freie Software unter der Apache License 2.0 @@ -658,7 +659,7 @@ vorhergehenden Projekt kennen. MariaDB ist ein Fork von MySQL welcher gegenüber MySQL rückwärts kompatibel ist. MariaDB ist dabei jedoch viel Community näher als MySQL und wird dabei auch sehr demokratisch entwickelt\footcite{mariadbgov}. MariaDB gehört dabei keiner einzelnen -Firma oder Person sonder der gemeinnützigen Organisation "MariaDB +Firma oder Person sondern der gemeinnützigen Organisation "MariaDB Foundation". Was für zusätzliche Stabilität sorgen sollte. MariaDB ist freie Software unter GNU Public License v2. Des weiteren hat MariaDB bei einer Variantenbewertung das beste Ergebnis geholt. @@ -667,12 +668,12 @@ einer Variantenbewertung das beste Ergebnis geholt. *** Editoren Das Hauptwerkzeug von jedem Entwickler ist sein Text Editor. Dabei -hat jeder meistens seine ganz eigene Präferenzen wenn es um die Wahl +hat jeder meistens seine ganz eigene Präferenzen, wenn es um die Wahl des Editors geht. - Atom :: Ivan hat während der Case Study hauptsächlich mit Atom\footcite{atom} gearbeitet. Atom wird von Github Inc. - entwickelt und basiert auf dem Electron Framework welches + entwickelt und basiert auf dem Electron Framework, welches seinerseits auf Webtechnologien wie Node.js und Chromium basiert. Atom ist freie Software unter der MIT Lizenz. @@ -685,18 +686,18 @@ des Editors geht. *** Dokumentation -Diese Dokumentation wurde in Org-mode\footcite{orgmode} einer -Erweiterung für den Text Editor Emacs geschrieben. Anschliessend wurde +Diese Dokumentation wurde in Org-mode\footcite{orgmode}, einer +Erweiterung für den Text Editor Emacs, geschrieben. Anschliessend wurde die Dokumentation in LaTeX\footcite{latex} Code konvertiert und -finalisiert. Der Zwischenschritt über Org-mode wurde gewählt weil +finalisiert. Der Zwischenschritt über Org-mode wurde gewählt, weil Org-mode etwas einfacher zu schreiben ist als reines LaTeX. -LaTeX ist eine Software welche einem die Benutzung des Textsatzsystems +LaTeX ist eine Software, welche einem die Benutzung des Textsatzsystems TeXs vereinfacht. Wir haben LaTeX gegenüber einem "What You See Is -What You Get" Editor gewählt weil es einem mit seiner Markup Sprache -erlaubt das Dokument in Text Dateien zu erstellen. Was wir als -Programmierer sehr angenehm finden. Dadurch das LaTeX auch nur aus -reinen Textdateien besteht kann man die Dokumente auch ohne weiteres +What You Get", Editor gewählt weil es einem mit seiner Markup Sprache +erlaubt das Dokument in Text Dateien zu erstellen, was wir als +Programmierer sehr angenehm finden. Dadurch, dass LaTeX auch nur aus +reinen Textdateien besteht, kann man die Dokumente auch ohne weiteres in die Versionskontrollsoftware einchecken und somit auf einfache Weise zusammen daran arbeiten und die Entwicklung im Log zurückverfolgen. @@ -708,52 +709,52 @@ Software unter der GNU Public License v3. Für das Entity Relation Diagramm in [[Modells]] haben wir jedoch Dia\footcite{dia} verwendet. Dia ist freie Software unter der GNU Public License v2. -Die Klassen Diagramme haben wir mit der Django Erweiterung +Die Klassendiagramme haben wir mit der Django Erweiterung "Django-Extensions"\footcite{django_extensions} erstellt. Django-Extensions ist freie Software unter der MIT Lizenz. ** Spezifikation *** User Stories -User Stories sind eine in Alltagssprache geschriebenen +User Stories sind in Alltagssprache geschriebene Software-Anforderungen. Sie sind bewusst kurz gehalten und beschreiben -die Wünsche und Ziele der Rollen welche die Software +die Wünsche und Ziele der Rollen, welche die Software verwenden.\footcite{userstory} **** Auftraggeber/Verwaltung Als Anbieter möchte ich... -- Artikel in Kategorien strukturieren damit Kunden sich orientieren können. -- Bilder zu meinen Artikeln hinzufügen damit sich Kunden das Produkt +- Artikel in Kategorien strukturieren, damit Kunden sich orientieren können. +- Bilder zu meinen Artikeln hinzufügen, damit sich Kunden das Produkt anschauen können. -- Artikel aktiv oder versteckt schalten können damit ich Produkte auch +- Artikel aktiv oder versteckt schalten können, damit ich Produkte auch temporär aus dem Verkauf nehmen kann. -- Lagerbestände verwalten können damit ich rechtzeitig nachbestellen kann. -- Nachbestellungen von Artikeln erfassen können damit ich weiss was +- Lagerbestände verwalten können, damit ich rechtzeitig nachbestellen kann. +- Nachbestellungen von Artikeln erfassen können, damit ich weiss, was bestellt wurde. -- eine komplette Liste meiner Artikel einsehen können damit ich einen +- eine komplette Liste meiner Artikel einsehen können, damit ich einen Überblick über meine Produkte habe. -- eine Liste aller Bestellungen einsehen können um allenfalls +- eine Liste aller Bestellungen einsehen können, um allenfalls Anpassungen vornehmen zu können. -- Produkte und Kategorien in einer Admin Seite editieren können um +- Produkte und Kategorien in einer Admin Seite editieren können, um diese einfach administrieren zu können. **** Kunde Als Kunde möchte ich... - durch Kategorien zu den Produkten navigieren um diese einfacher zu finden. -- Artikel einem Warenkorb hinzufügen können damit ich ungestört +- Artikel einem Warenkorb hinzufügen können, damit ich ungestört stöbern kann und erst am Schluss den administrativen Teil erledigen muss. - meinen Warenkorb anzeigen und editieren können um allenfalls Korrekturen vornehmen zu können. - die Artikel in meinem Warenkorb bestellen können. - vor dem Abschluss des Kaufs eine Zusammenstellung der Bestellung einsehen um die Richtigkeit der Daten zu überprüfen. -- mich registrieren können damit ich meine Adresse nicht jedes Mal neu +- mich registrieren können, damit ich meine Adresse nicht jedes Mal neu eingeben muss. - in einem Bereich der Webseite meine Profildaten zur Überprüfung einsehen können. -- Artikel in meiner bevorzugten Währung kaufen können damit ich die +- Artikel in meiner bevorzugten Währung kaufen können, damit ich die Preise nicht umrechnen muss. **** Interessenten @@ -768,7 +769,7 @@ Als Interessent möchte ich... Ein Use Case sammelt alle möglichen Szenarien, die eintreten können, wenn ein Akteur versucht, mit Hilfe des betrachteten Systems ein -bestimmtes Ziel zu erreichen. Dabei beschreibt er was beim Versuch der +bestimmtes Ziel zu erreichen. Dabei beschreibt er, was beim Versuch der Zielerreichung passieren kann. Je nach Ablauf kann auch ein Fehlschlag ein Ergebnis eines Anwendungsfalls sein (e.g. falsches Passwort beim Login). Dabei wird die technische Lösung nicht konkret beschrieben. @@ -798,15 +799,15 @@ Webshops beschränkt. **** Use Cases Detailbeschreibung Use Cases werden in der Regel mit Hilfe einer sogenannten Use Case -Schablone im Detail beschrieben damit klar ist wie der Ablauf jeweils +Schablone im Detail beschrieben, damit klar ist, wie der Ablauf jeweils genau aussieht. Die von uns verwendete Schablone wurde von Alistair Cockburn definiert. -Da ein Web-Shop eine sehr umfangreiche Applikation ist gibt es sehr -viele Use Cases welche beschrieben und umgesetzt werden müssen. Aus +Da ein Web-Shop eine sehr umfangreiche Applikation ist, gibt es sehr +viele Use Cases, welche beschrieben und umgesetzt werden müssen. Aus zeitlichen Gründen haben wir nur einen kleinen Teil der Use Cases im -Detail ausgearbeitet. Insbesondere diese welche wir selber -aus programmiert haben. Die gesamte Liste an Use Cases sieht wie folgt +Detail ausgearbeitet. Insbesondere diese, welche wir selber +ausprogrammiert haben. Die gesamte Liste an Use Cases sieht wie folgt aus, die Use Cases mit den Nummern wurden dabei im Detail ausgearbeitet: #+LATEX: {\footnotesize @@ -840,7 +841,7 @@ aus, die Use Cases mit den Nummern wurden dabei im Detail ausgearbeitet: | | <30> | | *Identifier + Name* | 1.0 Artikel durchstöbern | |---------------------+--------------------------------| -| *Description* | Durch klicken der verschiedenen Kategorien und ansehen der Artikel Details und Bilder. | +| *Description* | Durchklicken der verschiedenen Kategorien und ansehen der Artikel, Details und Bilder. | |---------------------+--------------------------------| | *Actors* | Kunden, Interessenten | |---------------------+--------------------------------| @@ -855,14 +856,14 @@ aus, die Use Cases mit den Nummern wurden dabei im Detail ausgearbeitet: | *Postconditions* | - | |---------------------+--------------------------------| | *Normal Flow* | 1. Website aufrufen | -| | 2. Kategorien durchsehen | +| | 2. Kategorien durchsehen | | | 3. Artikel anklicken | |---------------------+--------------------------------| | *Alternative Flow* | - | |---------------------+--------------------------------| | *Notes* | - | |---------------------+--------------------------------| -| *UC History* | 1.0 Draft erstellt durch AZ | +| *UC History* | 1.0 Draft erstellt durch AZ | |---------------------+--------------------------------| | *Author* | A. Zweili & I. Hörler | |---------------------+--------------------------------| @@ -884,7 +885,7 @@ aus, die Use Cases mit den Nummern wurden dabei im Detail ausgearbeitet: |---------------------+--------------------------------| | *Actors* | Interessent | |---------------------+--------------------------------| -| *Status* | Freigegeben | +| *Status* | Freigegeben | |---------------------+--------------------------------| | *Includes* | - | |---------------------+--------------------------------| @@ -900,7 +901,7 @@ aus, die Use Cases mit den Nummern wurden dabei im Detail ausgearbeitet: | | 4. Die Website leitet ihn in den Login Bereich um. | |---------------------+--------------------------------| | *Alternative Flow* | 1. User klickt auf den Link "Go to registration.". | -| | 2. User füllt das Registrations Formular mir falschen Daten aus. | +| | 2. User füllt das Registrationsformular mir falschen Daten aus. | | | 3. Die Website gibt die entsprechenden Fehler aus. | | | 4. Der User korrigiert die Angaben. | | | 5. User schliesst die Registrierung mit Klick auf "Register" ab. | @@ -1105,7 +1106,7 @@ aus, die Use Cases mit den Nummern wurden dabei im Detail ausgearbeitet: |---------------------+--------------------------------| | *Includes* | - | |---------------------+--------------------------------| -| *Trigger* | Ein Administrator möchte ein Passwort zurücksetzen weil es vergessen wurde. | +| *Trigger* | Ein Administrator möchte ein Passwort zurücksetzen, weil es vergessen wurde. | |---------------------+--------------------------------| | *Preconditions* | Account mit Administrationsrechten vorhanden. | |---------------------+--------------------------------| @@ -1155,7 +1156,7 @@ aus, die Use Cases mit den Nummern wurden dabei im Detail ausgearbeitet: |---------------------+--------------------------------| | *Includes* | - | |---------------------+--------------------------------| -| *Trigger* | Um das Sortiment zu erweitern möchte der Administrator einen neuen Artikel erfassen. | +| *Trigger* | Um das Sortiment zu erweitern, möchte der Administrator einen neuen Artikel erfassen. | |---------------------+--------------------------------| | *Preconditions* | Account mit Administrationsrechten vorhanden. | |---------------------+--------------------------------| @@ -1298,7 +1299,7 @@ aus, die Use Cases mit den Nummern wurden dabei im Detail ausgearbeitet: |---------------------+--------------------------------| | *Preconditions* | Account mit Administrationsrechten vorhanden. | |---------------------+--------------------------------| -| *Postconditions* | Die Bestellung hat eine angepasste Artikel Menge. | +| *Postconditions* | Die Bestellung hat eine angepasste Artikelmenge. | |---------------------+--------------------------------| | *Normal Flow* | 1. Der Administrator loggt sich unter https://didgeridoo.ml/admin ein. | | | 2. Admin klickt auf "Orders" und anschliessend auf die passende Order ID. | @@ -1318,20 +1319,20 @@ aus, die Use Cases mit den Nummern wurden dabei im Detail ausgearbeitet: |---------------------+--------------------------------| #+LATEX:} -*** Modells +*** Models -Wie bereits in [[Framework]] beschrieben übernimmt das Framework die +Wie bereits in [[Framework]] beschrieben, übernimmt das Framework die Erstellung der Tabellen in der Datenbank. Für den Aufbau der Anwendung und der Kommunikation im Team ist es jedoch von absoluter -Notwendigkeit das man sich über die Beziehung zwischen den Objekten -Gedanken macht. Insbesondere wenn die Anwendung nach wie vor auf einer +Notwendigkeit, dass man sich über die Beziehung zwischen den Objekten +Gedanken macht. Insbesondere, wenn die Anwendung nach wie vor auf einer relationalen Datenbank basiert. Aus diesem Grund haben wir vor Beginn der Arbeit ein klassisches Entity Relation Diagramm aufgezeichnet. Während der Entwicklung haben wir es dann kontinuierlich erweitert und korrigiert. Das finale Ergebnis ist in der Abbildung:([[fig:erd]]) zu sehen. -Django übernimmt dann jedoch das Erstellen der Tabellen und Benennen -derjenigen weshalb das Resultat in der Datenbank etwas anders +Django übernimmt dann jedoch das Erstellen und Benennen +der Tabellen, weshalb das Resultat in der Datenbank etwas anders aussieht. Zusätzlich kommt Django auch noch mit eigenen Tabellen daher. Der finale Aufbau der Datenbank ist in der Abbildung:([[fig:final_erd]]) zu sehen. Dieses ERD wurde mit der Django @@ -1362,14 +1363,14 @@ beschreiben und auf jeweils spezifische Probleme eingehen. Das "Category" Modell, Abbildung:([[fig:category]]), ist der Kernpunkt der Artikelnavigation und vom Aufbau her eigentlich eher simpel. -Allerdings hatten wir etwas Mühe die hierarchische Darstellung im +Allerdings hatten wir etwas Mühe, die hierarchische Darstellung im Template sauber abzubilden. Hier half uns ein Artikel\footcite{tree} -von Stackoverflow auf die richtige Lösung zu kommen. Nämlich das sich -das Ganze um zwei in einander verschachtelte Dictionaries handelt. +von Stackoverflow auf die richtige Lösung zu kommen mit dem Hinweis, +dass sich das ganze um zwei in einander verschachtelte Dictionaries handelt. Somit konnten wir dann über die Kategorie iterieren. #+ATTR_LATEX: :width 9cm :placement [H] -#+CAPTION: Klassenmodelll für Kategorien +#+CAPTION: Klassenmodell für Kategorien #+NAME: fig:category [[file:pictures/class_category.png]] @@ -1377,23 +1378,23 @@ Somit konnten wir dann über die Kategorie iterieren. Gemäss der Anforderung FA_1.4 muss es möglich sein für einen Artikel 0-5 Bilder hochzuladen. Wir stellen dies über eine Variabel im "Option" -Modell, Abbildung:([[fig:option]]), sicher gegen welche beim Speichern -überprüft wird. Die Variabel ist als Option im Admin Interface +Modell ( Abbildung:([[fig:option]]) ) sicher, gegen welche beim Speichern +geprüft wird. Die Variabel ist als Option im Admin Interface hinterlegt. Dadurch ist es möglich den Wert auch nachträglich noch zu ändern oder ganz zu deaktivieren. -Da diese Variabel jedoch essentiell für die Funktion des Webshops ist -mussten wir sicherstellen das sie von einem Administrator nicht aus -Versehen gelöscht oder umbenannt wird. Des weiteren macht es in der -Applikation im Momentan wenig Sinn wenn der User selber Optionen +Da diese Variabel jedoch essentiell für die Funktion des Webshops ist, +mussten wir sicherstellen, dass sie von einem Administrator nicht aus +Versehen gelöscht oder umbenannt wird. Des Weiteren macht es in der +Applikation momentan wenig Sinn, wenn der User selber Optionen hinzufügen kann. Aus diesen Gründen haben wir für das "Option" Modell den "Add" Button\footcite{removeadd} und die "Delete" -Option\footcite{removedelete} entfernt, sowie den Namen im Admin +Option\footcite{removedelete} entfernt sowie den Namen im Admin Interface nur lesbar gemacht\footcite{readonly}. Somit ist nur noch der Wert editierbar. #+ATTR_LATEX: :width 9cm :placement [H] -#+CAPTION: Klassenmodelll für Optionen +#+CAPTION: Klassenmodell für Optionen #+NAME: fig:option [[file:pictures/class_option.png]] @@ -1403,11 +1404,11 @@ Das Modell "ArticleStatus", Abbildung:([[fig:articlestatus]]), wird über einen Fremdschlüssel mit dem "Article" Modell verbunden und gibt diesem verschiedene Status. Gemäss der Anforderung FA_1.4 muss ein Artikel die Status "active" und "hidden" haben. Wir haben dies in der -Applikation dann auch gleich so umgesetzt das nur die Artikel +Applikation dann auch gleich so umgesetzt damit nur die Artikel angezeigt werden welche nicht den Status "hidden" haben. #+ATTR_LATEX: :width 9cm :placement [H] -#+CAPTION: Klassenmodelll für Artikelstatus +#+CAPTION: Klassenmodell für Artikelstatus #+NAME: fig:articlestatus [[file:pictures/class_articlestatus.png]] @@ -1415,18 +1416,18 @@ angezeigt werden welche nicht den Status "hidden" haben. Wir legen die Wechselkurse im Modell "ExchangeRate", Abbildung:([[fig:exchangerate]]), ab. Um Manipulationen aufs Datum und den -Namen einfacher zu machen werden diese beiden Attribute als +Namen einfacher zu machen, werden diese beiden Attribute als Fremdschlüssel hinterlegt. Die Wechselkurse werden dabei aus dem RSS Feed\footcite{snb} der Schweizerischen Nationalbank stündlich -abgeholt. Vor dem Ablegen in der Datenbank wird dann noch überprüft ob +abgeholt. Vor dem Ablegen in der Datenbank wird dann noch überprüft, ob sich die Werte geändert haben oder nicht. -Wir haben uns für den die Daten der SNB entschieden da sie einerseits +Wir haben uns für die Daten der SNB entschieden, da sie einerseits die benötigten Wechselkurse anbieten und anderseits bereits von unserer Basiswährung CHF ausgehen. Dadurch müssen wir nicht zuerst aus einer anderen Währung zurückrechnen. #+ATTR_LATEX: :width 9cm :placement [H] -#+CAPTION: Klassenmodelll für Wechselkurse +#+CAPTION: Klassenmodell für Wechselkurse #+NAME: fig:exchangerate [[file:pictures/class_exchangerate.png]] @@ -1443,15 +1444,15 @@ eine Liste mit allen möglichen Währungsnamen abgelegt. **** ExchangeRate_date Damit die Wechselkurse des Tages einfacher auf einer Zeile angezeigt -werden können haben wir das Datum in ein eigenes Modell, +werden können, haben wir das Datum in ein eigenes Modell, Abbildung:([[fig:exchangerate_date]]), ausgelagert. Dabei wird das Datum als Standardwert mitgegeben. Wir hatten dies zu Beginn noch falsch implementiert und das Datum als Funktion übergeben. Das führte jedoch dazu, dass die Funktion einmal beim Starten des Servers ausgeführt wurde und alle Wechselkurse immer das gleiche Datum hatten. Auf -Stackoverflow fanden wir dann die Lösung\footcite{timezone} das wir -die Datumsfunktion als Variabel übergeben müssen damit sie bei jedem -Erstellen des Objekt evaluiert wird. +Stackoverflow fanden wir dann die Lösung\footcite{timezone}, die +Datumsfunktion als Variabel zu übergeben damit sie bei jedem +Erstellen des Objektes evaluiert wird. #+ATTR_LATEX: :width 9cm :placement [H] #+CAPTION: Klassenmodell für Wechselkurse @@ -1465,7 +1466,7 @@ sehr komplex und widerspiegelt einen Artikel aus der realen Welt. Gemäss der Anforderung FA_1.4 hat er eine eindeutige ID (den Primärschlüssel), einen Namen von maximal 200 Zeichen, eine Beschreibung von maximal 2000 Zeichen, Status sowie 0 - 5 -Produktbilder welche vom Modell "Picture" über einen Fremdschlüssel +Produktbilder, welche vom Modell "Picture" über einen Fremdschlüssel zugewiesen werden. #+ATTR_LATEX: :width 9cm :placement [H] @@ -1476,7 +1477,7 @@ zugewiesen werden. **** OrderStatus Damit nachvollzogen werden kann in welchen Zustand sich eine -Bestellung gerade befindet haben wir ein Modell "OrderStatus", +Bestellung gerade befindet, haben wir ein Modell "OrderStatus", Abbildung:([[fig:orderstatus]]), erstellt. Für dieses Modell sind folgende Status angedacht: - ordered -> vom Kunden bestellt @@ -1529,9 +1530,9 @@ Foreign Key zum "ExchangeRate" Modell. Über den Foreign Key wird eine Beziehung auf den für die Bestellung aktuellen Wechselkurs der Währung hergestellt. -Da sich bei der Beziehung zwischen den Artikeln und dem Kunden um eine -"Viele zu Viele" Beziehung handelt braucht es noch ein zusätzliches -Modell welches die Beziehung abbildet. Dies realisieren wir über das +Da es sich bei der Beziehung zwischen den Artikeln und dem Kunden um eine +"Viele zu Viele" Beziehung handelt, braucht es noch ein zusätzliches +Modell, welches die Beziehung abbildet. Dies realisieren wir über das Modell "OrderPostion", Abbildung:([[fig:orderposition]]). In diesem Modell werden dann noch zusätzlich die bestellte Menge sowie @@ -1551,13 +1552,13 @@ welchem Preis die Ware bezogen wurde. **** ShoppingCart und ShoppingCartPosition -Bevor die Bestellungen erfasst werden kann der Kunde die Artikel in +Bevor die Bestellungen erfasst werden, kann der Kunde die Artikel in einem Warenkorb sammeln. Dieser funktioniert sehr ähnlich wie die Bestellungen. Über das Modell "ShoppingCart", Abbildung:([[fig:shoppingcart]]), und das Modell "ShoppingCartPosition", Abbildung:([[fig:shoppingcartposition]]), werden die ausgewählten Artikel sowie ihre Mengen einem User zugewiesen. Im Gegensatz zur Bestellung -wird im Artikel jedoch der Preis nicht gespeichert da sich der Preis +wird im Artikel jedoch der Preis nicht gespeichert, da sich der Preis vor der Bestellung noch ändern könnte. Wenn die Verwaltung etwa die Preise anpasst oder die Währungskurse ändern. @@ -1573,8 +1574,8 @@ Preise anpasst oder die Währungskurse ändern. **** City -Das "City" Modell speichert Städte Namen und die dazugehörige -Postleitzahl Die Städte werden als Teil der Adresse auf dem "Person" +Das "City" Modell speichert Städtenamen und die dazugehörige +Postleitzahl. Die Städte werden als Teil der Adresse auf dem "Person" Modell hinterlegt. Im aktuellen Zustand der Applikation enthält die Tabelle die Daten aller Schweizer Städte. @@ -1585,8 +1586,8 @@ Tabelle die Daten aller Schweizer Städte. **** Salutation -"Salutation", zu Deutsch Anrede, ist das Modell welches die möglichen -Anreden beinhaltet die ein User für sich hinterlegen kann. +"Salutation", zu Deutsch Anrede, ist das Modell, welches die möglichen +Anreden beinhaltet, die ein User für sich hinterlegen kann. Für den Moment haben wir die folgenden Auswahlmöglichkeiten hinterlegt: - Herr @@ -1608,18 +1609,18 @@ erweitern kann. In einem Post\footcite{usermodel} von Vitor Freitas werden die möglichen vier Varianten aufgeführt und erklärt. Eine davon ist nicht dafür gemacht zusätzliche Informationen zu speichern. Zwei weitere Varianten bauen darauf auf von einer Basis "User" Klasse -abzuleiten. Die erste Variante war für unsere Zwecke nicht geeignet da +abzuleiten. Die erste Variante war für unsere Zwecke nicht geeignet, da wir zwingend zusätzliche Informationen speichern wollten. Die -Varianten mit Vererbungen erschienen uns ungeeignet da die Möglichkeit -besteht die Sicherheit der Authentifizierung zu schwächen. Aus diesem +Varianten mit Vererbungen erschienen uns ungeeignet, da die Möglichkeit +besteht, die Sicherheit der Authentifizierung zu schwächen. Aus diesem Grund wird in der Django Dokumentation eher davor abgeraten diese -Varianten zu verwenden wenn man nicht genau weiss was man macht. +Varianten zu verwenden, wenn man nicht genau weiss, was man macht. Die verbleibende Variante erweitert das "User" Modell über eine -"One-to-One" Beziehung ein sogenanntes "Profil". Dadurch bleibt das +"One-to-One" Beziehung, ein sogenanntes "Profil". Dadurch bleibt das "User" Modell intakt und man kann zusätzliche Informationen über den -User speichern. Man sollte im Profil jedoch nur Daten speichern welche -nicht sicherheitsrelevant sind. Der Nachteil dieser Variante ist das +User speichern. Man sollte im Profil jedoch nur Daten speichern, welche +nicht sicherheitsrelevant sind. Der Nachteil dieser Variante ist, dass die Datenbank mit zusätzlichen Anfragen belastet werden kann. #+ATTR_LATEX: :width 9cm :placement [H] @@ -1669,29 +1670,29 @@ jeden Benutzer wird eine listitem erstellt und der Username als Text eingefügt. *** Backend Umsetzung -Django ist ein modellbasiertes Framework das die Programmierung der +Django ist ein modellbasiertes Framework, das die Programmierung der Datenbank gleich selbst regelt. Dadurch lässt sich backend seitig durchgängig in Python arbeiten. Die Umsetzung gliedert sich vereinfacht in 3 Bereiche: -1. Einem Frontend dass für den Benutzer gemacht ist und das mehrere +1. Einem Frontend, das für den Benutzer gemacht ist und das mehrere Submodule wie Categories oder Warenkorb beinhaltet. -2. Ein Backend welches zum Bearbeiten/Erstellen von Produkten dient. -3. Currencies die täglich abgeholt werden +2. Ein Backend, welches zum Bearbeiten/Erstellen von Produkten dient. +3. Currencies, die täglich abgeholt werden ** TODO Testing -Um die Funktionalität des Webshops sicherzustellen haben wir Die +Um die Funktionalität des Webshops sicherzustellen, haben wir die Applikation kontinuierlich gemäss den Testfällen unter [[Testfälle]] getestet und geprüft. Bei den Testfällen haben wir uns wie auch bei -den Use Cases hauptsächlich auf die Funktionen beschränkt welche wir -selber aus programmiert haben. Auch sehr hilfreich war das Admin +den Use Cases hauptsächlich auf die Funktionen beschränkt, welche wir +selber ausprogrammiert haben. Auch sehr hilfreich war das Admin Interface von Django. Damit konnten wir die Modells sehr gut auf ihre -Funktionalität überprüfen bevor wir sie im Frontend verwendeten. +Funktionalität überprüfen, bevor wir sie im Frontend verwendeten. *Fixtures* -Django hat ein Funktion\footcite{fixtures} genannt "Fixtures" welche -es einem erlaubt fixe Daten in die Datenbank zu schreiben. Dabei +Django hat eine Funktion\footcite{fixtures}, genannt "Fixtures", welche +es einem erlaubt, fixe Daten in die Datenbank zu schreiben. Dabei werden die Daten in YAML Syntax in eine .yaml Datei geschrieben und mittels folgendem Befehl dann in die Datenbank geladen: @@ -1703,7 +1704,7 @@ python3 /vagrant/django/didgeridoo/manage.py loaddata webshop Wir haben diese Funktion verwendet um Testdaten in der Datenbank zu speichern. Somit mussten wir etwa nicht von Hand Artikel oder User -erfassen. Zumindest nicht mehr sobald wir sicher waren das die +erfassen. Zumindest nicht mehr, als wir sicher waren, dass die dazugehörige Funktionen korrekt funktionieren. #+LATEX:\newpage @@ -1711,7 +1712,7 @@ dazugehörige Funktionen korrekt funktionieren. *** NEXT Testfälle -Alle Testfälle werden ausgehend von der Index Seite aus gestartet. +Alle Testfälle werden von der Index Seite aus gestartet. Dies wird in den Test Cases nicht noch einmal explizit erwähnt. Die Tabelle: ([[tab:testcases]]) zeigt dabei die Resultate des letzten Testlaufs. Dabei wurden keine Probleme mehr mit der Applikation @@ -1741,7 +1742,7 @@ entdeckt. |----------------------+----------------------+----------------------+----------------------+----------------------+----------------------+----------------------+----------------------| | *TC-08* | Artikel in Warenkorb legen | - | 1. Auf "Article of First Parent Category" klicken. | - | Meldung "please login to fill your basket..." | Die Artikel Details werden angezeigt. | Erfolgreich durchgeführt 19.02.2018 I.H. | |----------------------+----------------------+----------------------+----------------------+----------------------+----------------------+----------------------+----------------------| -| *TC-09* | Artikel in Warenkorb legen | TC-02\newline ausgeführt | 1. Auf "Article of First Parent Category"\newline 2. In das "Amount in piece." Feld Die Menge eintragen.\newline 3. Auf den "Add to Cart" Button klicken.\newline 4. Auf "CART" klicken. | Menge: 5 | Der Artikel wird als Warenkorb Position in der Datenbank gespeichert. | Der Cart mit dem Artikel wird angezeigt. | Erfolgreich durchgeführt 19.02.2018 I.H. | +| *TC-09* | Artikel in Warenkorb legen | TC-02\newline ausgeführt | 1. Auf "Article of First Parent Category"\newline 2. In das "Amount in piece" Feld Die Menge eintragen.\newline 3. Auf den "Add to Cart" Button klicken.\newline 4. Auf "CART" klicken. | Menge: 5 | Der Artikel wird als Warenkorb Position in der Datenbank gespeichert. | Der Cart mit dem Artikel wird angezeigt. | Erfolgreich durchgeführt 19.02.2018 I.H. | |----------------------+----------------------+----------------------+----------------------+----------------------+----------------------+----------------------+----------------------| | *TC-10* | Währung ändern | - | 1. Auf das Dropdown "Currencies" klicken.\newline 2. Den Eintrag "EUR" auswählen.\newline 3. Auf den Button "Select" klicken. | - | Die Artikel Preise werden in Euro angezeigt. | Die Index Seite wird angezeigt. | Erfolgreich durchgeführt 19.02.2018 I.H. | |----------------------+----------------------+----------------------+----------------------+----------------------+----------------------+----------------------+----------------------| diff --git a/docs/main.tex b/docs/main.tex index 09fbd80..d3a452a 100644 --- a/docs/main.tex +++ b/docs/main.tex @@ -10,7 +10,7 @@ \renewcommand{\abstractname}{Management Summary} \begin{abstract} Dies ist die Dokumentation für die zweite Case Study im Fach -Webtechnologien von Ivan Hörler und Andreas Zweili. Welche diese im +Webtechnologien von Ivan Hörler und Andreas Zweili, welche diese im Rahmen ihres 5. Semesters an der IBZ Schule in Aarau erarbeiteten. Die Case Study behandelt dabei das Erstellen eines Web-Shops und der dafür gewählten Werkzeuge, die Projektplanung sowie die dabei aufgetretenen @@ -18,7 +18,7 @@ Probleme. Zusätzlich sollen auch die Erfahrungen der Studenten im Zusammenhang des verwendeten Frameworks Django aufgezeigt werden. Dieses ist nicht -Teil des Kurikulums weshalb diese Arbeit interessante zusätzliche +Teil des Kurikulums, weshalb diese Arbeit interessante, zusätzliche Möglichkeiten im Bereich der Entwicklung von Webapplikationen aufzeigen kann. \end{abstract} From d38a37536afbda733ee4ca1c45641f62ed207b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Ho=CC=88rler?= Date: Tue, 27 Feb 2018 07:22:57 +0100 Subject: [PATCH 26/28] fix delete cartitems after purchase --- django/didgeridoo/webshop/views.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index ec2ee13..604d9d8 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -402,4 +402,19 @@ def checkout(request): def order(request): + cart = ShoppingCart.objects.get(user=request.user) + if cart: + # get all items in the cart of this customer: + cart_positions = CartPosition.objects.filter(cart=cart) + if (cart_positions.count()) > 0: + for cart_position in cart_positions: + restrict_cart_to_one_article( + request.user, + cart_position.article.id, + 0, + 'delete' + ) + else: + message = """something whent wrong. + We cold not delete your cartitems. """ return render(request, 'webshop/order.html', {}) From 208d7d51df3c5de78cf3237aed65d5e249012871 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Tue, 27 Feb 2018 18:21:34 +0100 Subject: [PATCH 27/28] correct the html templates --- .../webshop/templates/webshop/base.html | 2 +- .../webshop/templates/webshop/checkout.html | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/django/didgeridoo/webshop/templates/webshop/base.html b/django/didgeridoo/webshop/templates/webshop/base.html index 9f21839..94e473e 100644 --- a/django/didgeridoo/webshop/templates/webshop/base.html +++ b/django/didgeridoo/webshop/templates/webshop/base.html @@ -73,7 +73,7 @@ target='_blank' href='http://www.ibz.ch' >This is a case study project of Ivan Hörler and Andreas Zweili. -
    +
    It is a school project/excercise and has no commercial intent. diff --git a/django/didgeridoo/webshop/templates/webshop/checkout.html b/django/didgeridoo/webshop/templates/webshop/checkout.html index 67849ba..ad9c9ff 100644 --- a/django/didgeridoo/webshop/templates/webshop/checkout.html +++ b/django/didgeridoo/webshop/templates/webshop/checkout.html @@ -1,8 +1,8 @@ {% extends "webshop/base.html" %} -{% block section_title %}

    CHECKOUT

    {% endblock %} +{% block section_title %}CHECKOUT{% endblock %} {% block content %}

    Preview your Purchase:

    -
    +

    Shipping Address:

    {% if person %}

    Salutation: {{ person.salutation }}

    @@ -19,7 +19,7 @@

    {% endif %} {% if cart_position_list %} -
    +

    Your Items:

    @@ -52,15 +52,15 @@ {% endfor %} - +
    Total:
    + -
    Total:
    -
    {{ total }} {{ currency_name }}
    +
    {{ total }} {{ currency_name }}
    - + {% csrf_token %} {{ checkout_form.as_p }} @@ -76,6 +76,6 @@

    {{ message }} - +

    {% endblock %} From 45d15919cf6e9d5f19794ba535da06f5bce646e9 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Tue, 27 Feb 2018 18:40:05 +0100 Subject: [PATCH 28/28] change some code --- django/didgeridoo/webshop/views.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index 604d9d8..c2f363c 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -363,10 +363,8 @@ def checkout(request): # Here we handle all POST Operations: if request.method == 'POST': - print('checkout post', request.POST) # here we react to a change of amount per item in the Cart: if 'checkout' in request.POST: - print('checkout post request.POST = checkout_form') checkout_form = CheckoutForm(request.POST) if checkout_form.is_valid(): orderstatus = OrderStatus.objects.get(name='ordered') @@ -386,8 +384,7 @@ def checkout(request): amount=position.amount, price_in_chf=position.article.price_in_chf ) - cart.delete() - cart = False + return HttpResponseRedirect('/order/') return render(request, 'webshop/checkout.html', {'cart_position_list': cart_position_list,