falsche vorgehensweise um settings.py zurück zu bekommen
This commit is contained in:
parent
c4d018be95
commit
013d3d2d28
|
@ -43,5 +43,13 @@
|
||||||
group: www-data
|
group: www-data
|
||||||
mode: 0755
|
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
|
- name: Restart apache service
|
||||||
service: name=apache2 state=restarted
|
service: name=apache2 state=restarted
|
||||||
|
|
|
@ -5,7 +5,9 @@ from django.contrib.auth.models import User
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
from webshop.models import (Article, Order, OrderPosition,
|
from webshop.models import (Article, Order, OrderPosition,
|
||||||
Person, City, Picture, OrderOfGoods,
|
Person, City, Picture, OrderOfGoods,
|
||||||
Category, Option, Setting)
|
Category, Option)
|
||||||
|
|
||||||
|
from webshop.forms import PictureForm
|
||||||
|
|
||||||
|
|
||||||
class PersonInline(admin.StackedInline):
|
class PersonInline(admin.StackedInline):
|
||||||
|
@ -14,10 +16,47 @@ class PersonInline(admin.StackedInline):
|
||||||
verbose_name_plural = 'person'
|
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):
|
class UserAdmin(BaseUserAdmin):
|
||||||
inlines = (PersonInline,)
|
inlines = (PersonInline,)
|
||||||
|
|
||||||
|
|
||||||
|
class ArticleAdmin(admin.ModelAdmin):
|
||||||
|
inlines = (PictureInline,)
|
||||||
|
|
||||||
|
|
||||||
class OrderPositionInline(admin.StackedInline):
|
class OrderPositionInline(admin.StackedInline):
|
||||||
model = OrderPosition
|
model = OrderPosition
|
||||||
can_delete = False
|
can_delete = False
|
||||||
|
@ -42,11 +81,10 @@ class OrderOfGoodsAdmin(admin.ModelAdmin):
|
||||||
admin.site.unregister(User)
|
admin.site.unregister(User)
|
||||||
admin.site.register(User, UserAdmin)
|
admin.site.register(User, UserAdmin)
|
||||||
|
|
||||||
admin.site.register(Article)
|
admin.site.register(Article, ArticleAdmin)
|
||||||
admin.site.register(Order, OrderAdmin)
|
admin.site.register(Order, OrderAdmin)
|
||||||
|
admin.site.register(Picture, PictureAdmin)
|
||||||
admin.site.register(City)
|
admin.site.register(City)
|
||||||
admin.site.register(Picture)
|
|
||||||
admin.site.register(OrderOfGoods, OrderOfGoodsAdmin)
|
admin.site.register(OrderOfGoods, OrderOfGoodsAdmin)
|
||||||
admin.site.register(Category)
|
admin.site.register(Category)
|
||||||
admin.site.register(Option)
|
admin.site.register(Option, OptionAdmin)
|
||||||
admin.site.register(Setting)
|
|
||||||
|
|
|
@ -95,3 +95,10 @@
|
||||||
stock: 44
|
stock: 44
|
||||||
status: 3
|
status: 3
|
||||||
price_in_chf: 41.4
|
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 django import forms
|
||||||
from webshop.models import Salutation, City
|
from webshop.models import Salutation, City, Picture, Article, Option
|
||||||
|
|
||||||
|
|
||||||
class RegistrationForm(forms.Form):
|
class RegistrationForm(forms.Form):
|
||||||
|
@ -22,3 +22,32 @@ class RegistrationForm(forms.Form):
|
||||||
raise forms.ValidationError(
|
raise forms.ValidationError(
|
||||||
"The zip code and the city don't match.")
|
"The zip code and the city don't match.")
|
||||||
return city
|
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):
|
class Option(models.Model):
|
||||||
name = models.CharField(max_length=200, unique=True)
|
name = models.CharField(max_length=200, unique=True)
|
||||||
|
description = models.CharField(max_length=200, unique=True)
|
||||||
value = models.IntegerField(default=5)
|
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)
|
enabled = models.BooleanField(default=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return str(self.option)
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class ArticleStatus(models.Model):
|
class ArticleStatus(models.Model):
|
||||||
|
@ -74,8 +68,8 @@ class OrderOfGoods(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Picture(models.Model):
|
class Picture(models.Model):
|
||||||
name = models.CharField(max_length=200, unique=True)
|
name = models.CharField(max_length=200)
|
||||||
article = models.ForeignKey(Article, on_delete=models.CASCADE)
|
article = models.ForeignKey(Article)
|
||||||
image = models.ImageField(upload_to="images")
|
image = models.ImageField(upload_to="images")
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
</table>
|
</table>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p class="alert">
|
<p class="alert">
|
||||||
Something whent wrong, no articles are stored.
|
We are sorry but there are currently no articles in this category.
|
||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
</table>
|
</table>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p class="alert">
|
<p class="alert">
|
||||||
Something whent wrong, no articles are stored.
|
We are sorry but there are currently no articles being sold.
|
||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -59,10 +59,11 @@ def article_details(request, article_id):
|
||||||
{i: Category.objects.filter(parent_category=i.id)})
|
{i: Category.objects.filter(parent_category=i.id)})
|
||||||
|
|
||||||
article = get_object_or_404(Article, pk=article_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',
|
return render(request, 'webshop/article_details.html',
|
||||||
{'article': article,
|
{'article': article,
|
||||||
'category_list': category_list})
|
'category_list': category_list,
|
||||||
|
'picture_list': picture_list})
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def profile(request):
|
def profile(request):
|
||||||
|
|
|
@ -8,8 +8,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@book{djangobook,
|
@book{djangobook,
|
||||||
|
Note = {{\url{https://djangobook.com/}}},
|
||||||
publisher = {{leanpub.com}},
|
publisher = {{leanpub.com}},
|
||||||
Url = {{https://djangobook.com/}},
|
|
||||||
Urldate = {{2018-01-08}},
|
Urldate = {{2018-01-08}},
|
||||||
author = {Nigel George},
|
author = {Nigel George},
|
||||||
title = {{Mastering Django: Core}},
|
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.
|
Login). Dabei wird die technische Lösung nicht konkret beschrieben.
|
||||||
Die Detailstufe kann dabei sehr unterschiedlich sein.\footcite{usecase}
|
Die Detailstufe kann dabei sehr unterschiedlich sein.\footcite{usecase}
|
||||||
|
|
||||||
**** TODO Anwendungsfalliagramm
|
**** Anwendungsfalliagramm
|
||||||
|
|
||||||
"Ein Anwendungsfalldiagramm ... ist eine der 14 Diagrammarten der
|
"Ein Anwendungsfalldiagramm ... ist eine der 14 Diagrammarten der
|
||||||
Unified Modeling Language (UML), einer Sprache für die Modellierung
|
Unified Modeling Language (UML), einer Sprache für die Modellierung
|
||||||
|
|
Loading…
Reference in New Issue