From d929a23edea29b4d7af654547db748e82a3497e4 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Sun, 14 Jan 2018 12:16:00 +0100 Subject: [PATCH 1/6] remove the Setting model --- django/didgeridoo/webshop/admin.py | 3 +-- django/didgeridoo/webshop/models.py | 9 +-------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/django/didgeridoo/webshop/admin.py b/django/didgeridoo/webshop/admin.py index bf5d110..625d248 100644 --- a/django/didgeridoo/webshop/admin.py +++ b/django/didgeridoo/webshop/admin.py @@ -5,7 +5,7 @@ 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) class PersonInline(admin.StackedInline): @@ -58,4 +58,3 @@ admin.site.register(City) admin.site.register(OrderOfGoods, OrderOfGoodsAdmin) admin.site.register(Category) admin.site.register(Option) -admin.site.register(Setting) diff --git a/django/didgeridoo/webshop/models.py b/django/didgeridoo/webshop/models.py index 3bb3442..3d51293 100644 --- a/django/didgeridoo/webshop/models.py +++ b/django/didgeridoo/webshop/models.py @@ -8,17 +8,10 @@ from django.utils import timezone class Option(models.Model): name = 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): From d4502c655f43b6617a14a9addcb6c0dae4783530 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Sun, 14 Jan 2018 12:18:13 +0100 Subject: [PATCH 2/6] prevent options from deletion und don't allow new options --- django/didgeridoo/webshop/admin.py | 22 ++++++++++++++++++- .../didgeridoo/webshop/fixtures/webshop.yaml | 6 +++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/django/didgeridoo/webshop/admin.py b/django/didgeridoo/webshop/admin.py index 625d248..46148f2 100644 --- a/django/didgeridoo/webshop/admin.py +++ b/django/didgeridoo/webshop/admin.py @@ -20,6 +20,26 @@ class PictureInline(admin.StackedInline): 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,) @@ -57,4 +77,4 @@ admin.site.register(Order, OrderAdmin) admin.site.register(City) admin.site.register(OrderOfGoods, OrderOfGoodsAdmin) admin.site.register(Category) -admin.site.register(Option) +admin.site.register(Option, OptionAdmin) diff --git a/django/didgeridoo/webshop/fixtures/webshop.yaml b/django/didgeridoo/webshop/fixtures/webshop.yaml index a3c429d..d405c5a 100644 --- a/django/didgeridoo/webshop/fixtures/webshop.yaml +++ b/django/didgeridoo/webshop/fixtures/webshop.yaml @@ -95,3 +95,9 @@ stock: 44 status: 3 price_in_chf: 41.4 + +- model: webshop.Option + fields: + name: max_pictures + value: 5 + enabled: True From fabdc484920b28f01f0f5577615c8eb2015a139d Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Sun, 14 Jan 2018 12:19:44 +0100 Subject: [PATCH 3/6] add a description field to the Option model --- django/didgeridoo/webshop/fixtures/webshop.yaml | 1 + django/didgeridoo/webshop/models.py | 1 + 2 files changed, 2 insertions(+) diff --git a/django/didgeridoo/webshop/fixtures/webshop.yaml b/django/didgeridoo/webshop/fixtures/webshop.yaml index d405c5a..fd09a94 100644 --- a/django/didgeridoo/webshop/fixtures/webshop.yaml +++ b/django/didgeridoo/webshop/fixtures/webshop.yaml @@ -99,5 +99,6 @@ - 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/models.py b/django/didgeridoo/webshop/models.py index 3d51293..6a95fe8 100644 --- a/django/didgeridoo/webshop/models.py +++ b/django/didgeridoo/webshop/models.py @@ -7,6 +7,7 @@ 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) enabled = models.BooleanField(default=False) From 35de9bf7a54d1459bc7db3da08c54775cd0535e5 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Sun, 14 Jan 2018 12:20:47 +0100 Subject: [PATCH 4/6] add a check to limit picture uploads with the option max_pictures it's now possible to limit the amount of pictures a user is allowed to upload to an article. --- django/didgeridoo/webshop/admin.py | 11 ++++++++++- django/didgeridoo/webshop/forms.py | 31 +++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/django/didgeridoo/webshop/admin.py b/django/didgeridoo/webshop/admin.py index 46148f2..4951054 100644 --- a/django/didgeridoo/webshop/admin.py +++ b/django/didgeridoo/webshop/admin.py @@ -7,6 +7,8 @@ from webshop.models import (Article, Order, OrderPosition, Person, City, Picture, OrderOfGoods, Category, Option) +from webshop.forms import PictureForm + class PersonInline(admin.StackedInline): model = Person @@ -14,9 +16,15 @@ 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 - can_delete = False + form = PictureForm verbose_name_plural = 'pictures' @@ -74,6 +82,7 @@ admin.site.register(User, UserAdmin) admin.site.register(Article, ArticleAdmin) admin.site.register(Order, OrderAdmin) +admin.site.register(Picture, PictureAdmin) admin.site.register(City) admin.site.register(OrderOfGoods, OrderOfGoodsAdmin) admin.site.register(Category) 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'] From 2f58fcec94afd3ce3bca2d3049752900eb9003d4 Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Sun, 14 Jan 2018 12:22:27 +0100 Subject: [PATCH 5/6] allow dupilcated names of pictures --- 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 6a95fe8..c9d3765 100644 --- a/django/didgeridoo/webshop/models.py +++ b/django/didgeridoo/webshop/models.py @@ -68,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) image = models.ImageField(upload_to="images") def __str__(self): From e54765a54fa1e3f641ed9189c63f78992ca0720a Mon Sep 17 00:00:00 2001 From: Andreas Zweili Date: Sun, 14 Jan 2018 12:22:46 +0100 Subject: [PATCH 6/6] remove the delete option from the picture model This option got added by accident. If we would keep it then the related article would get deleted when one deletes a picture. --- 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 c9d3765..a17e7dc 100644 --- a/django/didgeridoo/webshop/models.py +++ b/django/didgeridoo/webshop/models.py @@ -68,8 +68,8 @@ class OrderOfGoods(models.Model): class Picture(models.Model): - 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):