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:
commit
5f2f1098a4
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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}},
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue