From 5b3613b6f682986c2d140df6691376f294fc7dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Thu, 4 Aug 2016 08:23:34 +0200 Subject: [PATCH] Gestion primitive des articles - Gestion CRU des articles --- kfet/forms.py | 19 ++++++-- kfet/migrations/0007_auto_20160804_0641.py | 19 ++++++++ kfet/models.py | 20 ++++++-- kfet/templates/kfet/article.html | 17 +++++++ kfet/templates/kfet/article_create.html | 13 +++++ kfet/templates/kfet/article_read.html | 15 ++++++ kfet/templates/kfet/article_update.html | 13 +++++ kfet/templates/kfet/base_nav.html | 1 + kfet/urls.py | 21 +++++++++ kfet/views.py | 55 +++++++++++++++++++++- 10 files changed, 183 insertions(+), 10 deletions(-) create mode 100644 kfet/migrations/0007_auto_20160804_0641.py create mode 100644 kfet/templates/kfet/article.html create mode 100644 kfet/templates/kfet/article_create.html create mode 100644 kfet/templates/kfet/article_read.html create mode 100644 kfet/templates/kfet/article_update.html diff --git a/kfet/forms.py b/kfet/forms.py index 5b7d264e..729ba9e2 100644 --- a/kfet/forms.py +++ b/kfet/forms.py @@ -1,6 +1,6 @@ from django import forms from django.contrib.auth.models import User -from kfet.models import Account, Checkout +from kfet.models import Account, Checkout, Article from gestioncof.models import CofProfile # ----- @@ -84,8 +84,8 @@ class UserRestrictForm(UserForm): class CheckoutForm(forms.ModelForm): class Meta: - model = Checkout - fields = ['name', 'valid_from', 'valid_to', 'balance', 'is_protected'] + model = Checkout + fields = ['name', 'valid_from', 'valid_to', 'balance', 'is_protected'] widgets = { 'valid_from': DateTimeWidget(), 'valid_to' : DateTimeWidget(), @@ -94,3 +94,16 @@ class CheckoutForm(forms.ModelForm): class CheckoutRestrictForm(CheckoutForm): class Meta(CheckoutForm.Meta): fields = ['name', 'valid_from', 'valid_to'] + +# ----- +# Article forms +# ----- + +class ArticleForm(forms.ModelForm): + class Meta: + model = Article + fields = ['name', 'is_sold', 'price', 'stock', 'category'] + +class ArticleRestrictForm(ArticleForm): + class Meta(ArticleForm.Meta): + fields = ['name', 'is_sold', 'price', 'category'] diff --git a/kfet/migrations/0007_auto_20160804_0641.py b/kfet/migrations/0007_auto_20160804_0641.py new file mode 100644 index 00000000..70bff402 --- /dev/null +++ b/kfet/migrations/0007_auto_20160804_0641.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('kfet', '0006_auto_20160804_0600'), + ] + + operations = [ + migrations.AlterField( + model_name='article', + name='price', + field=models.DecimalField(default=0, max_digits=6, decimal_places=2), + ), + ] diff --git a/kfet/models.py b/kfet/models.py index 264abbe5..af5ac686 100644 --- a/kfet/models.py +++ b/kfet/models.py @@ -1,7 +1,6 @@ from django.db import models from django.core.urlresolvers import reverse from django.core.exceptions import PermissionDenied -from django.contrib.auth.models import User, AnonymousUser from django.core.validators import RegexValidator from gestioncof.models import CofProfile from django.utils.six.moves import reduce @@ -215,15 +214,26 @@ class Statement(models.Model): class ArticleCategory(models.Model): name = models.CharField(max_length = 45) + def __str__(self): + return self.name + class Article(models.Model): - name = models.CharField(max_length = 45) - is_sold = models.BooleanField(default = True) - price = models.DecimalField(max_digits = 6, decimal_places = 2) - stock = models.IntegerField(default = 0) + name = models.CharField(max_length = 45) + is_sold = models.BooleanField(default = True) + price = models.DecimalField( + max_digits = 6, decimal_places = 2, + default = 0) + stock = models.IntegerField(default = 0) category = models.ForeignKey( ArticleCategory, on_delete = models.PROTECT, related_name = "articles") + def __str__(self): + return '%s - %s' % (self.category.name, self.name) + + def get_absolute_url(self): + return reverse('kfet.article.read', kwargs={'pk': self.pk}) + class ArticleRule(models.Model): article_on = models.OneToOneField( Article, on_delete = models.PROTECT, diff --git a/kfet/templates/kfet/article.html b/kfet/templates/kfet/article.html new file mode 100644 index 00000000..31484c96 --- /dev/null +++ b/kfet/templates/kfet/article.html @@ -0,0 +1,17 @@ +{% extends 'kfet/base.html' %} + +{% block title %}Liste des articles{% endblock %} + +{% block content %} + +

Créer un article

+ + + +{% endblock %} diff --git a/kfet/templates/kfet/article_create.html b/kfet/templates/kfet/article_create.html new file mode 100644 index 00000000..e5daa9e9 --- /dev/null +++ b/kfet/templates/kfet/article_create.html @@ -0,0 +1,13 @@ +{% extends 'kfet/base.html' %} + +{% block title %}Création d'un article{% endblock %} + +{% block content %} + +
+ {% csrf_token %} + {{ form.as_p }} + +
+ +{% endblock %} diff --git a/kfet/templates/kfet/article_read.html b/kfet/templates/kfet/article_read.html new file mode 100644 index 00000000..f6706568 --- /dev/null +++ b/kfet/templates/kfet/article_read.html @@ -0,0 +1,15 @@ +{% extends 'kfet/base.html' %} + +{% block title %}Informations sur l'article {{ article }}{% endblock %} + +{% block content %} + +

Editer les informations

+ +

Nom: {{ article.name }}

+

Catégorie: {{ article.category }}

+

Prix (hors réduction): {{ article.price }} €

+

Stock: {{ article.stock }}

+

En vente: {{ article.is_sold }}

+ +{% endblock %} diff --git a/kfet/templates/kfet/article_update.html b/kfet/templates/kfet/article_update.html new file mode 100644 index 00000000..608bac87 --- /dev/null +++ b/kfet/templates/kfet/article_update.html @@ -0,0 +1,13 @@ +{% extends 'kfet/base.html' %} + +{% block title %}Édition de l'article {{ article }}{% endblock %} + +{% block content %} + +
+ {% csrf_token %} + {{ form.as_p }} + +
+ +{% endblock %} diff --git a/kfet/templates/kfet/base_nav.html b/kfet/templates/kfet/base_nav.html index d18ac9d8..da05ab77 100644 --- a/kfet/templates/kfet/base_nav.html +++ b/kfet/templates/kfet/base_nav.html @@ -15,6 +15,7 @@ {% endif %} diff --git a/kfet/urls.py b/kfet/urls.py index 4d66ae8d..e32f7119 100644 --- a/kfet/urls.py +++ b/kfet/urls.py @@ -57,4 +57,25 @@ urlpatterns = [ url('^checkout/(?P\d+)/edit$', permission_required('kfet.is_team')(views.CheckoutUpdate.as_view()), name = 'kfet.checkout.update'), + + # ----- + # Article urls + # ----- + + # Article - General + url('^article/$', + permission_required('kfet.is_team')(views.ArticleList.as_view()), + name = 'kfet.article'), + # Article - Create + url('^article/new$', + permission_required('kfet.is_team')(views.ArticleCreate.as_view()), + name = 'kfet.article.create'), + # Article - Read + url('^article/(?P\d+)$', + permission_required('kfet.is_team')(views.ArticleRead.as_view()), + name = 'kfet.article.read'), + # Article - Update + url('^article/(?P\d+)/edit$', + permission_required('kfet.is_team')(views.ArticleUpdate.as_view()), + name = 'kfet.article.update'), ] diff --git a/kfet/views.py b/kfet/views.py index 03126ef7..41cc1dee 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -10,7 +10,7 @@ from django.contrib.auth.models import User from django.http import HttpResponse, Http404 import json from gestioncof.models import CofProfile, Clipper -from kfet.models import Account, Checkout +from kfet.models import Account, Checkout, Article from kfet.forms import * @login_required @@ -279,7 +279,7 @@ class CheckoutCreate(SuccessMessageMixin, CreateView): # Checkout - Read class CheckoutRead(DetailView): - model = Checkout + model = Checkout template_name = 'kfet/checkout_read.html' context_object_name = 'checkout' @@ -298,3 +298,54 @@ class CheckoutUpdate(SuccessMessageMixin, UpdateView): raise PermissionDenied # Updating return super(CheckoutUpdate, self).form_valid(form) + +# ----- +# Article views +# ----- + +# Article - General + +class ArticleList(ListView): + model = Article + queryset = Article.objects.order_by('category', '-is_sold', 'name') + template_name = 'kfet/article.html' + context_object_name = 'articles' + +# Article - Create + +class ArticleCreate(SuccessMessageMixin, CreateView): + model = Article + template_name = 'kfet/article_create.html' + form_class = ArticleForm + success_message = 'Nouvel item : %(category)s - %(name)s' + + # Surcharge de la validation + def form_valid(self, form): + # Checking permission + if not self.request.user.has_perm('add_article'): + raise PermissionDenied + # Creating + return super(ArticleCreate, self).form_valid(form) + +# Article - Read + +class ArticleRead(DetailView): + model = Article + template_name = 'kfet/article_read.html' + context_object_name = 'article' + +# Article - Update + +class ArticleUpdate(UpdateView): + model = Article + template_name = 'kfet/article_update.html' + form_class = ArticleRestrictForm + success_message = "Informations mises à jour pour l'article : %(name)s" + + # Surcharge de la validation + def form_valid(self, form): + # Checking permission + if not self.request.user.has_perm('change_article'): + raise PermissionDenied + # Updating + return super(ArticleUpdate, self).form_valid(form)