Gestion primitive des articles

- Gestion CRU des articles
This commit is contained in:
Aurélien Delobelle 2016-08-04 08:23:34 +02:00
parent 22ccf02393
commit 5b3613b6f6
10 changed files with 183 additions and 10 deletions

View file

@ -1,6 +1,6 @@
from django import forms from django import forms
from django.contrib.auth.models import User 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 from gestioncof.models import CofProfile
# ----- # -----
@ -84,8 +84,8 @@ class UserRestrictForm(UserForm):
class CheckoutForm(forms.ModelForm): class CheckoutForm(forms.ModelForm):
class Meta: class Meta:
model = Checkout model = Checkout
fields = ['name', 'valid_from', 'valid_to', 'balance', 'is_protected'] fields = ['name', 'valid_from', 'valid_to', 'balance', 'is_protected']
widgets = { widgets = {
'valid_from': DateTimeWidget(), 'valid_from': DateTimeWidget(),
'valid_to' : DateTimeWidget(), 'valid_to' : DateTimeWidget(),
@ -94,3 +94,16 @@ class CheckoutForm(forms.ModelForm):
class CheckoutRestrictForm(CheckoutForm): class CheckoutRestrictForm(CheckoutForm):
class Meta(CheckoutForm.Meta): class Meta(CheckoutForm.Meta):
fields = ['name', 'valid_from', 'valid_to'] 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']

View file

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

View file

@ -1,7 +1,6 @@
from django.db import models from django.db import models
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.contrib.auth.models import User, AnonymousUser
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from gestioncof.models import CofProfile from gestioncof.models import CofProfile
from django.utils.six.moves import reduce from django.utils.six.moves import reduce
@ -215,15 +214,26 @@ class Statement(models.Model):
class ArticleCategory(models.Model): class ArticleCategory(models.Model):
name = models.CharField(max_length = 45) name = models.CharField(max_length = 45)
def __str__(self):
return self.name
class Article(models.Model): class Article(models.Model):
name = models.CharField(max_length = 45) name = models.CharField(max_length = 45)
is_sold = models.BooleanField(default = True) is_sold = models.BooleanField(default = True)
price = models.DecimalField(max_digits = 6, decimal_places = 2) price = models.DecimalField(
stock = models.IntegerField(default = 0) max_digits = 6, decimal_places = 2,
default = 0)
stock = models.IntegerField(default = 0)
category = models.ForeignKey( category = models.ForeignKey(
ArticleCategory, on_delete = models.PROTECT, ArticleCategory, on_delete = models.PROTECT,
related_name = "articles") 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): class ArticleRule(models.Model):
article_on = models.OneToOneField( article_on = models.OneToOneField(
Article, on_delete = models.PROTECT, Article, on_delete = models.PROTECT,

View file

@ -0,0 +1,17 @@
{% extends 'kfet/base.html' %}
{% block title %}Liste des articles{% endblock %}
{% block content %}
<p><a href="{% url 'kfet.article.create' %}">Créer un article</a></p>
<ul>
{% for article in articles %}
<li>
<a href="{% url 'kfet.article.read' article.pk %}">{{ article }}</a>
</li>
{% endfor %}
</ul>
{% endblock %}

View file

@ -0,0 +1,13 @@
{% extends 'kfet/base.html' %}
{% block title %}Création d'un article{% endblock %}
{% block content %}
<form submit="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Enregistrer">
</form>
{% endblock %}

View file

@ -0,0 +1,15 @@
{% extends 'kfet/base.html' %}
{% block title %}Informations sur l'article {{ article }}{% endblock %}
{% block content %}
<p><a href="{% url 'kfet.article.update' article.pk %}">Editer les informations</a></p>
<p>Nom: {{ article.name }}</p>
<p>Catégorie: {{ article.category }}</p>
<p>Prix (hors réduction): {{ article.price }} €</p>
<p>Stock: {{ article.stock }}</p>
<p>En vente: {{ article.is_sold }}</p>
{% endblock %}

View file

@ -0,0 +1,13 @@
{% extends 'kfet/base.html' %}
{% block title %}Édition de l'article {{ article }}{% endblock %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Mettre à jour">
</form>
{% endblock %}

View file

@ -15,6 +15,7 @@
<ul> <ul>
<li><a href="{% url "kfet.account" %}">Comptes</a></li> <li><a href="{% url "kfet.account" %}">Comptes</a></li>
<li><a href="{% url "kfet.checkout" %}">Caisses</a></li> <li><a href="{% url "kfet.checkout" %}">Caisses</a></li>
<li><a href="{% url "kfet.article" %}">Articles</a></li>
</ul> </ul>
{% endif %} {% endif %}
</nav> </nav>

View file

@ -57,4 +57,25 @@ urlpatterns = [
url('^checkout/(?P<pk>\d+)/edit$', url('^checkout/(?P<pk>\d+)/edit$',
permission_required('kfet.is_team')(views.CheckoutUpdate.as_view()), permission_required('kfet.is_team')(views.CheckoutUpdate.as_view()),
name = 'kfet.checkout.update'), 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<pk>\d+)$',
permission_required('kfet.is_team')(views.ArticleRead.as_view()),
name = 'kfet.article.read'),
# Article - Update
url('^article/(?P<pk>\d+)/edit$',
permission_required('kfet.is_team')(views.ArticleUpdate.as_view()),
name = 'kfet.article.update'),
] ]

View file

@ -10,7 +10,7 @@ from django.contrib.auth.models import User
from django.http import HttpResponse, Http404 from django.http import HttpResponse, Http404
import json import json
from gestioncof.models import CofProfile, Clipper from gestioncof.models import CofProfile, Clipper
from kfet.models import Account, Checkout from kfet.models import Account, Checkout, Article
from kfet.forms import * from kfet.forms import *
@login_required @login_required
@ -279,7 +279,7 @@ class CheckoutCreate(SuccessMessageMixin, CreateView):
# Checkout - Read # Checkout - Read
class CheckoutRead(DetailView): class CheckoutRead(DetailView):
model = Checkout model = Checkout
template_name = 'kfet/checkout_read.html' template_name = 'kfet/checkout_read.html'
context_object_name = 'checkout' context_object_name = 'checkout'
@ -298,3 +298,54 @@ class CheckoutUpdate(SuccessMessageMixin, UpdateView):
raise PermissionDenied raise PermissionDenied
# Updating # Updating
return super(CheckoutUpdate, self).form_valid(form) 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)