diff --git a/.pre-commit.sh b/.pre-commit.sh deleted file mode 100755 index 0e0e3c1a..00000000 --- a/.pre-commit.sh +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env bash -# pre-commit hook for gestioCOF project. -# -# Run formatters first, then checkers. -# Formatters which changed a file must set the flag 'formatter_updated'. - -exit_code=0 -formatter_updated=0 -checker_dirty=0 - -# TODO(AD): We should check only staged changes. -# Working? -> Stash unstaged changes, run it, pop stash -STAGED_PYTHON_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".py$") - - -# Formatter: black - -printf "> black ... " - -if type black &>/dev/null; then - if [ -z "$STAGED_PYTHON_FILES" ]; then - printf "OK\n" - else - BLACK_OUTPUT="/tmp/gc-black-output.log" - touch $BLACK_OUTPUT - - if ! echo "$STAGED_PYTHON_FILES" | xargs -d'\n' black --check &>$BLACK_OUTPUT; then - echo "$STAGED_PYTHON_FILES" | xargs -d'\n' black &>$BLACK_OUTPUT - tail -1 $BLACK_OUTPUT - formatter_updated=1 - else - printf "OK\n" - fi - fi -else - printf "SKIP: program not found\n" - printf "HINT: Install black with 'pip3 install black' (black requires Python>=3.6)\n" -fi - -# Formatter: isort - -printf "> isort ... " - -if type isort &>/dev/null; then - if [ -z "$STAGED_PYTHON_FILES" ]; then - printf "OK\n" - else - ISORT_OUTPUT="/tmp/gc-isort-output.log" - touch $ISORT_OUTPUT - - if ! echo "$STAGED_PYTHON_FILES" | xargs -d'\n' isort --check-only &>$ISORT_OUTPUT; then - echo "$STAGED_PYTHON_FILES" | xargs -d'\n' isort &>$ISORT_OUTPUT - printf "Reformatted.\n" - formatter_updated=1 - else - printf "OK\n" - fi - fi -else - printf "SKIP: program not found\n" - printf "HINT: Install isort with 'pip install isort'\n" -fi - -# Checker: flake8 - -printf "> flake8 ... " - -if type flake8 &>/dev/null; then - if [ -z "$STAGED_PYTHON_FILES" ]; then - printf "OK\n" - else - FLAKE8_OUTPUT="/tmp/gc-flake8-output.log" - touch $FLAKE8_OUTPUT - - if ! echo "$STAGED_PYTHON_FILES" | xargs -d'\n' flake8 &>$FLAKE8_OUTPUT; then - printf "FAIL\n" - cat $FLAKE8_OUTPUT - checker_dirty=1 - else - printf "OK\n" - fi - fi -else - printf "SKIP: program not found\n" - printf "HINT: Install flake8 with 'pip install flake8'\n" -fi - -# End - -if [ $checker_dirty -ne 0 ] -then - printf ">>> Checker(s) detect(s) issue(s)\n" - printf " You can still commit and push :)\n" - printf " Be warned that our CI may cause you more trouble.\n" -fi - -if [ $formatter_updated -ne 0 ] -then - printf ">>> Working tree updated by formatter(s)\n" - printf " Add changes to staging area and retry.\n" - exit_code=1 -fi - -printf "\n" - -exit $exit_code diff --git a/gestioncof/templates/gestioncof/home.html b/gestioncof/templates/gestioncof/home.html index bbaeae44..599956b9 100644 --- a/gestioncof/templates/gestioncof/home.html +++ b/gestioncof/templates/gestioncof/home.html @@ -92,7 +92,7 @@ -

Journal de Caisse

+

Kaisse

Gestion tirages BdA

diff --git a/journaldecaisse/admin.py b/journaldecaisse/admin.py index 4ad58d3d..49263e46 100644 --- a/journaldecaisse/admin.py +++ b/journaldecaisse/admin.py @@ -1,10 +1,13 @@ from django.contrib import admin -from .models import JournalEntry +from .models import JournalEntry, Produit, ProduitStock, Option class JournalAdmin(admin.ModelAdmin): list_display = ('entry_text', 'cofeux_id', 'payment_type') -admin.site.register(JournalEntry, JournalAdmin) \ No newline at end of file +admin.site.register(JournalEntry, JournalAdmin) +admin.site.register(Option) +admin.site.register(Produit) +admin.site.register(ProduitStock) \ No newline at end of file diff --git a/journaldecaisse/migrations/0001_initial.py b/journaldecaisse/migrations/0001_initial.py index 933fb3fb..76c699a7 100644 --- a/journaldecaisse/migrations/0001_initial.py +++ b/journaldecaisse/migrations/0001_initial.py @@ -1,6 +1,7 @@ -# Generated by Django 2.2.9 on 2020-02-16 17:14 +# Generated by Django 2.2.10 on 2020-02-18 15:01 from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -15,11 +16,39 @@ class Migration(migrations.Migration): name='JournalEntry', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('entry_text', models.CharField(max_length=500)), - ('entry_date', models.DateTimeField(verbose_name='date published')), - ('cofeux_id', models.CharField(max_length=8)), - ('entry_amount', models.FloatField()), - ('payment_type', models.CharField(choices=[('cash', 'Espèces'), ('cb', 'CB'), ('check', 'Chèque')], max_length=20, verbose_name='Niveau')), + ('entry_text', models.CharField(max_length=500, verbose_name='Détail entrée')), + ('entry_date', models.DateTimeField(verbose_name='Date')), + ('cofeux_id', models.CharField(max_length=8, verbose_name='Trigramme')), + ('entry_amount', models.FloatField(verbose_name='Montant')), + ('payment_type', models.CharField(choices=[('Espèces', 'Espèces'), ('CB', 'CB'), ('Chèque', 'Chèque')], max_length=20, verbose_name='Moyen de paiement')), + ], + options={ + 'verbose_name': 'Entrée du JDC', + 'verbose_name_plural': 'Entrées du JDC', + }, + ), + migrations.CreateModel( + name='Option', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, verbose_name='Nom')), + ], + ), + migrations.CreateModel( + name='Produit', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('Produit', models.CharField(max_length=100, verbose_name='Nom')), + ('option_1_value', models.CharField(max_length=100, verbose_name='Option 1 Valeur')), + ('option_1', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='journaldecaisse.Option')), + ], + ), + migrations.CreateModel( + name='ProduitStock', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('Amount', models.IntegerField(verbose_name='Nombre en Stock')), + ('ProduitTaille', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='journaldecaisse.Produit')), ], ), ] diff --git a/journaldecaisse/migrations/0002_auto_20200218_1607.py b/journaldecaisse/migrations/0002_auto_20200218_1607.py new file mode 100644 index 00000000..e9893f79 --- /dev/null +++ b/journaldecaisse/migrations/0002_auto_20200218_1607.py @@ -0,0 +1,67 @@ +# Generated by Django 2.2.10 on 2020-02-18 15:07 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('journaldecaisse', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='produit', + name='option_2', + field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, related_name='option_2', to='journaldecaisse.Option'), + preserve_default=False, + ), + migrations.AddField( + model_name='produit', + name='option_2_value', + field=models.CharField(default=0, max_length=100, verbose_name='Option 2 Valeur'), + preserve_default=False, + ), + migrations.AddField( + model_name='produit', + name='option_3', + field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, related_name='option_3', to='journaldecaisse.Option'), + preserve_default=False, + ), + migrations.AddField( + model_name='produit', + name='option_3_value', + field=models.CharField(default=0, max_length=100, verbose_name='Option 3 Valeur'), + preserve_default=False, + ), + migrations.AddField( + model_name='produit', + name='option_4', + field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, related_name='option_4', to='journaldecaisse.Option'), + preserve_default=False, + ), + migrations.AddField( + model_name='produit', + name='option_4_value', + field=models.CharField(default=0, max_length=100, verbose_name='Option 4 Valeur'), + preserve_default=False, + ), + migrations.AddField( + model_name='produit', + name='option_5', + field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, related_name='option_5', to='journaldecaisse.Option'), + preserve_default=False, + ), + migrations.AddField( + model_name='produit', + name='option_5_value', + field=models.CharField(default=0, max_length=100, verbose_name='Option 5 Valeur'), + preserve_default=False, + ), + migrations.AlterField( + model_name='produit', + name='option_1', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='option_1', to='journaldecaisse.Option'), + ), + ] diff --git a/journaldecaisse/migrations/0003_auto_20200218_1610.py b/journaldecaisse/migrations/0003_auto_20200218_1610.py new file mode 100644 index 00000000..c525ca22 --- /dev/null +++ b/journaldecaisse/migrations/0003_auto_20200218_1610.py @@ -0,0 +1,38 @@ +# Generated by Django 2.2.10 on 2020-02-18 15:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('journaldecaisse', '0002_auto_20200218_1607'), + ] + + operations = [ + migrations.AlterField( + model_name='produit', + name='option_1_value', + field=models.CharField(blank=True, max_length=100, verbose_name='Option 1 Valeur'), + ), + migrations.AlterField( + model_name='produit', + name='option_2_value', + field=models.CharField(blank=True, max_length=100, verbose_name='Option 2 Valeur'), + ), + migrations.AlterField( + model_name='produit', + name='option_3_value', + field=models.CharField(blank=True, max_length=100, verbose_name='Option 3 Valeur'), + ), + migrations.AlterField( + model_name='produit', + name='option_4_value', + field=models.CharField(blank=True, max_length=100, verbose_name='Option 4 Valeur'), + ), + migrations.AlterField( + model_name='produit', + name='option_5_value', + field=models.CharField(blank=True, max_length=100, verbose_name='Option 5 Valeur'), + ), + ] diff --git a/journaldecaisse/migrations/0004_produit_price.py b/journaldecaisse/migrations/0004_produit_price.py new file mode 100644 index 00000000..7df8111e --- /dev/null +++ b/journaldecaisse/migrations/0004_produit_price.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.10 on 2020-02-18 15:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('journaldecaisse', '0003_auto_20200218_1610'), + ] + + operations = [ + migrations.AddField( + model_name='produit', + name='price', + field=models.FloatField(default=0, verbose_name='Prix'), + preserve_default=False, + ), + ] diff --git a/journaldecaisse/models.py b/journaldecaisse/models.py index 22423e05..41ec4288 100644 --- a/journaldecaisse/models.py +++ b/journaldecaisse/models.py @@ -8,16 +8,51 @@ PAYMENTS_CHOICES = ( ) class JournalEntry(models.Model): - entry_text = models.CharField(max_length=500) + entry_text = models.CharField("Détail entrée", max_length=500) entry_date = models.DateTimeField('Date') cofeux_id = models.CharField("Trigramme", max_length=8) - entry_amount = models.FloatField() + entry_amount = models.FloatField("Montant") payment_type = models.CharField( _("Moyen de paiement"), choices=PAYMENTS_CHOICES, max_length=20 ) def __str__(self): return self.entry_text + class Meta: + verbose_name = 'Entrée du JDC' + verbose_name_plural = 'Entrées du JDC' + +class Option(models.Model): + name = models.CharField("Nom", max_length=100) + def __str__(self): + return self.name + +class Produit(models.Model): + Produit = models.CharField("Nom", max_length=100) + option_1 = models.ForeignKey(Option, on_delete=models.CASCADE, related_name="option_1") + option_1_value = models.CharField("Option 1 Valeur", max_length=100, blank=True) + option_2 = models.ForeignKey(Option, on_delete=models.CASCADE, related_name="option_2") + option_2_value = models.CharField("Option 2 Valeur", max_length=100, blank=True) + option_3 = models.ForeignKey(Option, on_delete=models.CASCADE, related_name="option_3") + option_3_value = models.CharField("Option 3 Valeur", max_length=100, blank=True) + option_4 = models.ForeignKey(Option, on_delete=models.CASCADE, related_name="option_4") + option_4_value = models.CharField("Option 4 Valeur", max_length=100, blank=True) + option_5 = models.ForeignKey(Option, on_delete=models.CASCADE, related_name="option_5") + option_5_value = models.CharField("Option 5 Valeur", max_length=100, blank=True) + price = models.FloatField("Prix") + + def __str__(self): + name = str(self.Produit) + " " + self.option_1_value + " " + self.option_2_value + " " + self.option_3_value + " " + self.option_4_value + " " + self.option_5_value + str(self.price) +"€" + return name + + +class ProduitStock(models.Model): + ProduitTaille = models.ForeignKey(Produit, on_delete=models.CASCADE) + Amount = models.IntegerField("Nombre en Stock") + def __str__(self): + return str(self.ProduitTaille) + " : " + str(self.Amount) + + diff --git a/journaldecaisse/templates/journaldecaisse/vente.html b/journaldecaisse/templates/journaldecaisse/vente.html new file mode 100644 index 00000000..442a7d1a --- /dev/null +++ b/journaldecaisse/templates/journaldecaisse/vente.html @@ -0,0 +1,37 @@ +{% extends "petitscours/base_title.html" %} +{% load staticfiles %} + +{% block realcontent %} +

Vente

+ + + {% for product in product_list %} + + {% endfor %} + + + + +{% endblock %} + diff --git a/journaldecaisse/urls.py b/journaldecaisse/urls.py index c7547dc2..7c6bc3e7 100644 --- a/journaldecaisse/urls.py +++ b/journaldecaisse/urls.py @@ -1,8 +1,13 @@ from django.urls import path +from django.conf.urls import url from . import views app_name = 'journaldecaisse' urlpatterns = [ path('', views.index, name='index'), -] \ No newline at end of file + path('vente.html', views.vente, name='vente'), + url(r'^ajax/iterate_options/$', views.iterate_options, name='iterate_options'), +] + + diff --git a/journaldecaisse/views.py b/journaldecaisse/views.py index a7add974..7f81a0c7 100644 --- a/journaldecaisse/views.py +++ b/journaldecaisse/views.py @@ -1,8 +1,36 @@ from django.http import HttpResponse -from .models import JournalEntry +from .models import JournalEntry, Produit from django.shortcuts import render +from django.http import JsonResponse def index(request): entry_list = JournalEntry.objects.order_by('entry_date') context = {'entry_list': entry_list} - return render(request, 'journaldecaisse/index.html', context) \ No newline at end of file + return render(request, 'journaldecaisse/index.html', context) + +def vente(request): + product_list = Produit.objects.all().values_list() + products = [] + for elem in product_list: + products.append(elem[1]) + products = list(set(products)) + + + context = {"product_list" : products} + return render(request, 'journaldecaisse/vente.html', context) + + + + +def iterate_options(request): + options_selected = request.GET.get('option', None) + options_selected = options_selected.split(":") + print(options_selected) + + test = Produit.objects.filter(**{ options_selected[0] : options_selected[1] }) + print(test) + + data = { + 'is_taken': None + } + return JsonResponse(data)