From 013d3d2d2848b17893fea15d00bd35fae07993bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Ho=CC=88rler?= Date: Sun, 14 Jan 2018 14:07:53 +0100 Subject: [PATCH] =?UTF-8?q?falsche=20vorgehensweise=20um=20settings.py=20z?= =?UTF-8?q?ur=C3=BCck=20zu=20bekommen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ansible/roles/web_AI-5/tasks/main.yml | 8 ++++ django/didgeridoo/webshop/admin.py | 48 +++++++++++++++++-- .../didgeridoo/webshop/fixtures/webshop.yaml | 7 +++ django/didgeridoo/webshop/forms.py | 31 +++++++++++- django/didgeridoo/webshop/models.py | 14 ++---- .../webshop/templates/webshop/category.html | 2 +- .../webshop/templates/webshop/index.html | 2 +- django/didgeridoo/webshop/views.py | 5 +- docs/andreas.bib | 2 +- docs/doku.org | 2 +- 10 files changed, 99 insertions(+), 22 deletions(-) diff --git a/ansible/roles/web_AI-5/tasks/main.yml b/ansible/roles/web_AI-5/tasks/main.yml index 5daf02b..40cb890 100644 --- a/ansible/roles/web_AI-5/tasks/main.yml +++ b/ansible/roles/web_AI-5/tasks/main.yml @@ -43,5 +43,13 @@ group: www-data mode: 0755 + +- name: Add currency refresh cronjob + cron: + name: "refresh currencies" + minute: "0" + job: "wget -O /dev/null https://didgeridoo.ml/currencies" + + - name: Restart apache service service: name=apache2 state=restarted diff --git a/django/didgeridoo/webshop/admin.py b/django/didgeridoo/webshop/admin.py index 06b4dd4..e3d5f74 100644 --- a/django/didgeridoo/webshop/admin.py +++ b/django/didgeridoo/webshop/admin.py @@ -5,7 +5,9 @@ from django.contrib.auth.models import User # Register your models here. from webshop.models import (Article, Order, OrderPosition, Person, City, Picture, OrderOfGoods, - Category, Option, Setting) + Category, Option) + +from webshop.forms import PictureForm class PersonInline(admin.StackedInline): @@ -14,10 +16,47 @@ class PersonInline(admin.StackedInline): verbose_name_plural = 'person' +class PictureAdmin(admin.ModelAdmin): + form = PictureForm + ordering = ('name',) + list_display = ('name', 'article',) + + +class PictureInline(admin.StackedInline): + model = Picture + form = PictureForm + can_delete = False + verbose_name_plural = 'pictures' + + +class OptionAdmin(admin.ModelAdmin): + model = Option + list_display = ('name', 'description',) + readonly_fields = ('name','description',) + + + def get_actions(self, request): + #Disable delete + actions = super(OptionAdmin, self).get_actions(request) + del actions['delete_selected'] + return actions + + def has_delete_permission(self, request, obj=None): + #Disable delete + return False + + def has_add_permission(self, request): + return False + + class UserAdmin(BaseUserAdmin): inlines = (PersonInline,) +class ArticleAdmin(admin.ModelAdmin): + inlines = (PictureInline,) + + class OrderPositionInline(admin.StackedInline): model = OrderPosition can_delete = False @@ -42,11 +81,10 @@ class OrderOfGoodsAdmin(admin.ModelAdmin): admin.site.unregister(User) admin.site.register(User, UserAdmin) -admin.site.register(Article) +admin.site.register(Article, ArticleAdmin) admin.site.register(Order, OrderAdmin) +admin.site.register(Picture, PictureAdmin) admin.site.register(City) -admin.site.register(Picture) admin.site.register(OrderOfGoods, OrderOfGoodsAdmin) admin.site.register(Category) -admin.site.register(Option) -admin.site.register(Setting) +admin.site.register(Option, OptionAdmin) diff --git a/django/didgeridoo/webshop/fixtures/webshop.yaml b/django/didgeridoo/webshop/fixtures/webshop.yaml index a3c429d..fd09a94 100644 --- a/django/didgeridoo/webshop/fixtures/webshop.yaml +++ b/django/didgeridoo/webshop/fixtures/webshop.yaml @@ -95,3 +95,10 @@ stock: 44 status: 3 price_in_chf: 41.4 + +- model: webshop.Option + fields: + name: max_pictures + description: "Maximum number of Pictures a user is allowed to upload." + value: 5 + enabled: True diff --git a/django/didgeridoo/webshop/forms.py b/django/didgeridoo/webshop/forms.py index c87ec6c..5e431a9 100644 --- a/django/didgeridoo/webshop/forms.py +++ b/django/didgeridoo/webshop/forms.py @@ -1,5 +1,5 @@ from django import forms -from webshop.models import Salutation, City +from webshop.models import Salutation, City, Picture, Article, Option class RegistrationForm(forms.Form): @@ -22,3 +22,32 @@ class RegistrationForm(forms.Form): raise forms.ValidationError( "The zip code and the city don't match.") return city + + +class PictureForm(forms.ModelForm): + def max_pictures(self): + try: + option = Option.objects.get(name='max_pictures') + if option.enabled: + return option.value + else: + return False + except: + return False + + def count_pictures(self, _article): + count = Picture.objects.filter(article=_article.id).count() + return count + + def clean(self): + article = self.cleaned_data.get('article') + print(self.max_pictures()) + if self.max_pictures(): + if (self.count_pictures(article) >= self.max_pictures()): + raise forms.ValidationError("Only " + str(self.max_pictures()) + + " pictures per article allowed.") + return self.cleaned_data + + class Meta: + model = Picture + fields = ['name', 'article', 'image'] diff --git a/django/didgeridoo/webshop/models.py b/django/didgeridoo/webshop/models.py index 3bb3442..a17e7dc 100644 --- a/django/didgeridoo/webshop/models.py +++ b/django/didgeridoo/webshop/models.py @@ -7,18 +7,12 @@ from django.utils import timezone class Option(models.Model): name = models.CharField(max_length=200, unique=True) + description = models.CharField(max_length=200, unique=True) value = models.IntegerField(default=5) - - def __str__(self): - return self.name - - -class Setting(models.Model): - option = models.ForeignKey(Option, on_delete=models.CASCADE) enabled = models.BooleanField(default=False) def __str__(self): - return str(self.option) + return self.name class ArticleStatus(models.Model): @@ -74,8 +68,8 @@ class OrderOfGoods(models.Model): class Picture(models.Model): - name = models.CharField(max_length=200, unique=True) - article = models.ForeignKey(Article, on_delete=models.CASCADE) + name = models.CharField(max_length=200) + article = models.ForeignKey(Article) image = models.ImageField(upload_to="images") def __str__(self): diff --git a/django/didgeridoo/webshop/templates/webshop/category.html b/django/didgeridoo/webshop/templates/webshop/category.html index bb6a535..5ea3a14 100644 --- a/django/didgeridoo/webshop/templates/webshop/category.html +++ b/django/didgeridoo/webshop/templates/webshop/category.html @@ -25,7 +25,7 @@ {% else %}

- Something whent wrong, no articles are stored. + We are sorry but there are currently no articles in this category.

{% endif %} {% endblock %} diff --git a/django/didgeridoo/webshop/templates/webshop/index.html b/django/didgeridoo/webshop/templates/webshop/index.html index 7f661bd..7eff913 100644 --- a/django/didgeridoo/webshop/templates/webshop/index.html +++ b/django/didgeridoo/webshop/templates/webshop/index.html @@ -26,7 +26,7 @@ {% else %}

- Something whent wrong, no articles are stored. + We are sorry but there are currently no articles being sold.

{% endif %} {% endblock %} diff --git a/django/didgeridoo/webshop/views.py b/django/didgeridoo/webshop/views.py index cce4b63..1a4a4db 100644 --- a/django/didgeridoo/webshop/views.py +++ b/django/didgeridoo/webshop/views.py @@ -59,10 +59,11 @@ def article_details(request, article_id): {i: Category.objects.filter(parent_category=i.id)}) article = get_object_or_404(Article, pk=article_id) - + picture_list = Picture.objects.filter(article=article_id) return render(request, 'webshop/article_details.html', {'article': article, - 'category_list': category_list}) + 'category_list': category_list, + 'picture_list': picture_list}) @login_required def profile(request): diff --git a/docs/andreas.bib b/docs/andreas.bib index 96bd885..b0a3cdc 100644 --- a/docs/andreas.bib +++ b/docs/andreas.bib @@ -8,8 +8,8 @@ } @book{djangobook, + Note = {{\url{https://djangobook.com/}}}, publisher = {{leanpub.com}}, - Url = {{https://djangobook.com/}}, Urldate = {{2018-01-08}}, author = {Nigel George}, title = {{Mastering Django: Core}}, diff --git a/docs/doku.org b/docs/doku.org index d1dbd58..e4ced80 100644 --- a/docs/doku.org +++ b/docs/doku.org @@ -485,7 +485,7 @@ ein Ergebnis eines Anwendungsfalls sein (e.g. falsches Pass- wort beim Login). Dabei wird die technische Lösung nicht konkret beschrieben. Die Detailstufe kann dabei sehr unterschiedlich sein.\footcite{usecase} -**** TODO Anwendungsfalliagramm +**** Anwendungsfalliagramm "Ein Anwendungsfalldiagramm ... ist eine der 14 Diagrammarten der Unified Modeling Language (UML), einer Sprache für die Modellierung