Commit faa28ced authored by Gabriel Detraz's avatar Gabriel Detraz

Corrections et readme

parent 3e8a7355
# Re2o
# Amap
Basé sur re2o 2016, developpe au rezometz par Goulven Kermarec, Gabriel Détraz et Augustin Lemesle
## Avant propos
Amap est un logiciel d'administration développé initiallement au rezometz. Il se veut agnostique au réseau considéré, de manière à être installable en quelques clics.
Il utilise le framework django avec python3. Il permet de gérer les adhérents, les machines, les factures, les droits d'accès, les switchs et la topologie du réseau.
De cette manière, il est possible de pluguer très facilement des services dessus, qui accèdent à la base de donnée en passant par django (ex : dhcp), en chargeant la liste de toutes les mac-ip, ou la liste des mac-ip autorisées sur le réseau (adhérent à jour de cotisation).
Il utilise le framework django avec python3. Il permet de gérer les commandes et paiements de paniers pour l'amap.
Il s'agit d'un système modulaire, où on peut pluguer facilement de nouvelles fonctionnalitési besoin.
## Installation
......@@ -14,7 +16,6 @@ Dépendances :
* python3-django (1.8, jessie-backports)
* python3-django-reversion (1.10, stretch)
* django-bootstrap3 (pip3 install)
* django-ldapdb (pip3 install)
Moteur de db conseillé (mysql), postgresql fonctionne également.
Pour mysql, il faut installer :
......@@ -32,7 +33,8 @@ Ensuite, effectuer les migrations. Un squelette de base de donnée, via un mysql
amap/wsgi.py permet de fonctionner avec apache2 en production
## Fonctionnement avec les services
## Fonctionnement applicatif
Pour charger les objets django, il suffit de faire User.objects.all() pour tous les users par exemple.
Cependant, pour que les services fonctionnent de manière simple, des fonctions toutes prètes existent deja pour charger la liste des users autorisés à se connecter ( has_access(user)), etc. Ces fonctions sont personnalisables, et permettent un fonctionnement très simple des services.
L'application permet d'enregistrer des paniers, des dates de livraisons, des dates limites de commande.
Une commande n'est possible que si le solde est positif. Une fois la date limite passée , les commandes ne peuvent plus etre modifiées.
Les droits bureau permettent de gérer les livraisons, commandes etc
{% extends "panier/sidebar.html" %}
{% load bootstrap3 %}
{% load staticfiles%}
{% block title %}Controle des livraisons{% endblock %}
{% block content %}
<h2>Etat des livraisons</h2>
<form class="form" method="post">
{% csrf_token %}
{{ controlform.management_form }}
<table class="table table-striped">
<thead>
<tr>
<th>Utilisateur</th>
<th>Designation</th>
<th>Prix unitaire</th>
<th>Quantite</th>
<th>Date de livraison</th>
<th>Livre</th>
</tr>
</thead>
{% for form in controlform.forms %}
{% bootstrap_form_errors form %}
<tr>
<td>{{ form.instance.user }}</td>
<td>{{ form.instance.nom }}</td>
<td>{{ form.instance.prix_unitaire }}</td>
<td>{{ form.instance.quantite }}</td>
<td>{{ form.instance.date }}</td>
<td>{{ form.livre }}</td>
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
</tr>
{% endfor %}
</table>
{% bootstrap_button "Modifier" button_type="submit" icon="star" %}
</form>
{% endblock %}
......@@ -5,5 +5,6 @@
<p><a href="{% url "panier:index-article" %}">Liste des paniers en vente</a></p>
{% if is_bureau %}
<p><a href="{% url "panier:index-paiement" %}">Liste des moyens de paiement</a></p>
<p><a href="{% url "panier:control" %}">Etat des livraisons</a></p>
{% endif %}
{% endblock %}
......@@ -20,6 +20,7 @@ urlpatterns = [
url(r'^add_article/$', views.add_article, name='add-article'),
url(r'^edit_article/(?P<articleid>[0-9]+)$', views.edit_article, name='edit-article'),
url(r'^del_article/$', views.del_article, name='del-article'),
url(r'^control/$', views.control, name='control'),
url(r'^index_article/$', views.index_article, name='index-article'),
url(r'^history/(?P<object>paiement)/(?P<id>[0-9]+)$', views.history, name='history'),
url(r'^history/(?P<object>livraison)/(?P<id>[0-9]+)$', views.history, name='history'),
......
......@@ -15,7 +15,8 @@ from django.db import transaction
from reversion import revisions as reversion
from .models import Panier, Paiement, Commande, Credit, Livraison
from .forms import PaiementForm, CreditForm, CreditFullForm, DelPaiementForm, LivraisonForm, DelLivraisonForm
from .forms import PanierForm, DelPanierForm, SelectArticleForm, BaseEditCommandeForm, NewCommandeForm
from .forms import PanierForm, DelPanierForm, SelectArticleForm, FullEditCommandeForm, BaseEditCommandeForm, NewCommandeForm
from django.forms import modelformset_factory, formset_factory
from users.views import User
from django.utils import timezone
......@@ -51,7 +52,7 @@ def new_commande(request, userid):
if timezone.now() > commande.date.date_modif and not request.user.has_perms(('bureau',)):
messages.error(request, "Vous ne pouvez plus passer commande, livraison proche")
return redirect("/users/profil/" + str(request.user.id))
if user.solde() - prix_unitaire*quantite < MINIMUM_LEVEL:
if user.solde() - commande.prix() < MINIMUM_LEVEL:
messages.error(request, "Solde insuffisant pour effectuer l'operation")
return redirect("/users/profil/" + userid)
with transaction.atomic(), reversion.create_revision():
......@@ -75,13 +76,17 @@ def edit_commande(request, commandeid):
messages.error(request, "Vous ne pouvez pas commander pour quelqu'un d'autre !")
return redirect("/users/profil/" + str(request.user.id))
if request.user.has_perms(('bureau',)):
commande = BaseEditCommandeForm(request.POST or None, instance=commande_instance)
commande = FullEditCommandeForm(request.POST or None, instance=commande_instance)
else:
if timezone.now() > commande_instance.date.date_modif:
messages.error(request, "Vous ne pouvez plus modifier la commande, livraison proche")
return redirect("/users/profil/" + str(request.user.id))
commande = FullEditCommandeForm(request.POST or None, instance=commande_instance)
commande = BaseEditCommandeForm(request.POST or None, instance=commande_instance)
if commande.is_valid():
new_commande = commande.save(commit=False)
if commande_instance.user.solde() - new_commande.prix() < MINIMUM_LEVEL:
messages.error(request, "Solde insuffisant pour effectuer l'operation")
return redirect("/panier/")
with transaction.atomic(), reversion.create_revision():
commande.save()
reversion.set_user(request.user)
......@@ -309,6 +314,18 @@ def del_article(request):
return redirect("/panier/index_article")
return form({'panierform': article}, 'panier/panier.html', request)
@login_required
@permission_required('bureau')
def control(request):
commande_list = Commande.objects.order_by('date').reverse()
controlform_set = modelformset_factory(Commande, fields=('livre',), extra=0)
controlform = controlform_set(request.POST or None, queryset=commande_list)
if controlform.is_valid():
controlform.save()
messages.success(request, "Livraisons enregistrees")
return redirect("/panier/")
return render(request, 'panier/control.html', {'controlform': controlform})
@login_required
def history(request, object, id):
if object == 'credit':
......
......@@ -98,7 +98,7 @@
<footer class="navbar">
<div class="containerfluid text-center">
<p>Re2o 2016 - Goulven Kermarec, Gabriel Détraz, Augustin Lemesle</p>
<p>Amap 2016 - Gabriel Détraz</p>
</div>
</footer>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment