Merge branch 'master' into currency

* master:
  remove delete option from inline images
  correct the empty message on the index page
  rephrase a second message
  rephrase the message on empty categories
  remove the delete option from the picture model
  allow dupilcated names of pictures
  add a check to limit picture uploads
  add a description field to the Option model
  prevent options from deletion und don't allow new options
  remove the Setting model
  allow pictures to be added on the article
  readd pictures to the article details page
  fix the url of the django book
  remove a todo tag
  add the currencies refresh cronjob to the ansible role
This commit is contained in:
Ivan Hörler 2018-01-14 13:49:45 +01:00
commit 5f2f1098a4
10 changed files with 99 additions and 22 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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']

View File

@ -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):

View File

@ -25,7 +25,7 @@
</table>
{% else %}
<p class="alert">
Something whent wrong, no articles are stored.
We are sorry but there are currently no articles in this category.
</p>
{% endif %}
{% endblock %}

View File

@ -26,7 +26,7 @@
</table>
{% else %}
<p class="alert">
Something whent wrong, no articles are stored.
We are sorry but there are currently no articles being sold.
</p>
{% endif %}
{% endblock %}

View File

@ -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):

View File

@ -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}},

View File

@ -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