From c875881c632cefb29912762ef2f335ada1d19779 Mon Sep 17 00:00:00 2001 From: nanoy Date: Tue, 27 Aug 2019 18:25:53 +0200 Subject: [PATCH 1/6] Add number of quotes on stats page. Close #10 --- coopeV3/urls.py | 4 +- coopeV3/views.py | 56 ++++++++++++++++++- gestion/urls.py | 1 - gestion/views.py | 43 +------------- templates/nav.html | 2 +- .../gestion => templates}/stats.html | 4 ++ 6 files changed, 63 insertions(+), 47 deletions(-) rename {gestion/templates/gestion => templates}/stats.html (97%) diff --git a/coopeV3/urls.py b/coopeV3/urls.py index 4b764f4..8247789 100644 --- a/coopeV3/urls.py +++ b/coopeV3/urls.py @@ -25,11 +25,13 @@ urlpatterns = [ path('home', views.homepage, name="homepage"), path('about', views.about, name="about"), path('coope-runner', views.coope_runner, name="coope-runner"), + path('stats', views.stats, name="stats"), path('admin/doc/', include('django.contrib.admindocs.urls')), path('admin/', admin.site.urls), path('users/', include('users.urls')), path('gestion/', include('gestion.urls')), - path('preferences/', include('preferences.urls')), + path('preferences/', include('preferences.urls')), + ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/coopeV3/views.py b/coopeV3/views.py index 430d66b..e9108b8 100644 --- a/coopeV3/views.py +++ b/coopeV3/views.py @@ -3,9 +3,15 @@ import os from django.shortcuts import redirect, render from django.urls import reverse from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.contrib.auth.models import User, Group -from preferences.models import GeneralPreferences -from gestion.models import Keg +from preferences.models import GeneralPreferences, PaymentMethod, Cotisation +from gestion.models import Keg, ConsumptionHistory, Category, Product, Menu +from users.models import School + + +from .acl import active_required, admin_required def home(request): """ @@ -50,4 +56,48 @@ def about(request): with open(settings.BASE_DIR + "/LICENSE", "r") as f: for line in f: license.append(line) - return render(request, "about.html", {"contributors": contributors, "license": license}) \ No newline at end of file + return render(request, "about.html", {"contributors": contributors, "license": license}) + +@active_required +@login_required +@admin_required +def stats(request): + users = User.objects.all() + adherents = [x for x in users if x.profile.is_adherent] + transactions = ConsumptionHistory.objects.all() + categories = Category.objects.all() + categories_shown = Category.objects.exclude(order=0) + products = Product.objects.all() + active_products = Product.objects.filter(is_active=True) + active_kegs = Keg.objects.filter(is_active=True) + sum_positive_balance = sum([x.profile.balance for x in users if x.profile.balance > 0]) + sum_balance = sum([x.profile.balance for x in users]) + schools = School.objects.all() + groups = Group.objects.all() + admins = User.objects.filter(is_staff=True) + superusers = User.objects.filter(is_superuser=True) + menus = Menu.objects.all() + payment_methods = PaymentMethod.objects.all() + cotisations = Cotisation.objects.all() + gp,_ = GeneralPreferences.objects.get_or_create(pk=1) + nb_quotes = len(gp.global_message.split("\n")) + return render(request, "stats.html", { + "users": users, + "adherents": adherents, + "transactions": transactions, + "categories": categories, + "categories_shown": categories_shown, + "products": products, + "active_products": active_products, + "active_kegs": active_kegs, + "sum_positive_balance": sum_positive_balance, + "sum_balance": sum_balance, + "schools": schools, + "groups": groups, + "admins": admins, + "superusers": superusers, + "menus": menus, + "payment_methods": payment_methods, + "cotisations": cotisations, + "nb_quotes": nb_quotes, + }) \ No newline at end of file diff --git a/gestion/urls.py b/gestion/urls.py index 01e846a..c5c777f 100644 --- a/gestion/urls.py +++ b/gestion/urls.py @@ -52,7 +52,6 @@ urlpatterns = [ path('categoryProfile/', views.categoryProfile, name="categoryProfile"), path('categoriesList', views.categoriesList, name="categoriesList"), path('categories-autocomplete', views.CategoriesAutocomplete.as_view(), name="categories-autocomplete"), - path('stats', views.stats, name="stats"), path('divide', views.divide, name="divide"), path('gen_invoice', views.gen_invoice, name="gen_invoice"), path('compute-price', views.compute_price_view, name="compute-price"), diff --git a/gestion/views.py b/gestion/views.py index 8077f31..fbadea9 100644 --- a/gestion/views.py +++ b/gestion/views.py @@ -1013,7 +1013,9 @@ def divide(request): "divide_histories": divide_histories, } ) + ########## categories ########## + @active_required @login_required @permission_required('gestion.add_category') @@ -1091,47 +1093,6 @@ class CategoriesAutocomplete(autocomplete.Select2QuerySetView): qs = qs.filter(name__icontains=self.q) return qs -@active_required -@login_required -@admin_required -def stats(request): - users = User.objects.all() - adherents = [x for x in users if x.profile.is_adherent] - transactions = ConsumptionHistory.objects.all() - categories = Category.objects.all() - categories_shown = Category.objects.exclude(order=0) - products = Product.objects.all() - active_products = Product.objects.filter(is_active=True) - active_kegs = Keg.objects.filter(is_active=True) - sum_positive_balance = sum([x.profile.balance for x in users if x.profile.balance > 0]) - sum_balance = sum([x.profile.balance for x in users]) - schools = School.objects.all() - groups = Group.objects.all() - admins = User.objects.filter(is_staff=True) - superusers = User.objects.filter(is_superuser=True) - menus = Menu.objects.all() - payment_methods = PaymentMethod.objects.all() - cotisations = Cotisation.objects.all() - return render(request, "gestion/stats.html", { - "users": users, - "adherents": adherents, - "transactions": transactions, - "categories": categories, - "categories_shown": categories_shown, - "products": products, - "active_products": active_products, - "active_kegs": active_kegs, - "sum_positive_balance": sum_positive_balance, - "sum_balance": sum_balance, - "schools": schools, - "groups": groups, - "admins": admins, - "superusers": superusers, - "menus": menus, - "payment_methods": payment_methods, - "cotisations": cotisations, - }) - ########## Compute price ########## def compute_price_view(request): diff --git a/templates/nav.html b/templates/nav.html index e31ee29..876d1bd 100644 --- a/templates/nav.html +++ b/templates/nav.html @@ -31,7 +31,7 @@ {% endif %} {% if request.user.is_staff %} - Stats + Stats Relevé diff --git a/gestion/templates/gestion/stats.html b/templates/stats.html similarity index 97% rename from gestion/templates/gestion/stats.html rename to templates/stats.html index d40f393..771e863 100644 --- a/gestion/templates/gestion/stats.html +++ b/templates/stats.html @@ -63,6 +63,10 @@ Nombre de superusers {{superusers.count}} + + Nombre de citations + {{nb_quotes}} + Nombre 8 8 From b26b304672daee6d9ebc90fb534b86f3cf28f1ae Mon Sep 17 00:00:00 2001 From: nanoy Date: Tue, 27 Aug 2019 18:51:24 +0200 Subject: [PATCH 2/6] Fix price profile deleteion. Fix #12 --- preferences/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preferences/views.py b/preferences/views.py index 11dca4a..ffeda09 100644 --- a/preferences/views.py +++ b/preferences/views.py @@ -242,6 +242,6 @@ def delete_price_profile(request,pk): """ price_profile = get_object_or_404(PriceProfile, pk=pk) message = "Le profil de prix " + price_profile.name + " a bien été supprimé" - price_pofile.delete() + price_profile.delete() messages.success(request, message) return redirect(reverse('preferences:priceProfilesIndex')) From aa97c2633566928b22b272695e783b09042e7f30 Mon Sep 17 00:00:00 2001 From: nanoy Date: Tue, 27 Aug 2019 18:58:55 +0200 Subject: [PATCH 3/6] Decrement stockBar and not stockHold on transactions --- gestion/models.py | 2 +- gestion/views.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/gestion/models.py b/gestion/models.py index 06a4559..fd4278d 100644 --- a/gestion/models.py +++ b/gestion/models.py @@ -95,7 +95,7 @@ class Product(models.Model): def __str__(self): if self.draft_category == self.DRAFT_NONE: - return self.name + "(" + str(self.amount) + " €)" + return self.name + " (" + str(self.amount) + " €)" else: return self.name + " (" + str(self.amount) + " €, " + str(self.deg) + "°)" diff --git a/gestion/views.py b/gestion/views.py index fbadea9..1ec41b1 100644 --- a/gestion/views.py +++ b/gestion/views.py @@ -161,8 +161,11 @@ def order(request): kegHistory.amountSold += Decimal(quantity * product.amount) kegHistory.save() else: - if(product.stockHold > 0): - product.stockHold -= 1 + if(product.stockBar > quantity): + product.stockBar -= quantity + product.save() + else: + product.stockBar = 0 product.save() consumption, _ = Consumption.objects.get_or_create(customer=user, product=product) consumption.quantity += quantity @@ -195,8 +198,11 @@ def order(request): consumption, _ = Consumption.objects.get_or_create(customer=user, product=article) consumption.quantity += quantity consumption.save() - if(article.stockHold > 0): - article.stockHold -= 1 + if(article.stockBar > quantity): + article.stockBar -= quantity + article.save() + else: + article.stockBar = 0 article.save() user.profile.alcohol += Decimal(quantity * float(product.deg) * product.volume * 0.79 /10 /1000) user.save() From f17697dd36da2a1644fb7a8bd5e446cb751ba287 Mon Sep 17 00:00:00 2001 From: nanoy Date: Tue, 27 Aug 2019 23:21:15 +0200 Subject: [PATCH 4/6] Change stock behavior --- gestion/admin.py | 4 +- gestion/migrations/0012_auto_20190827_2119.py | 53 +++++++++++++++++++ gestion/models.py | 8 +-- .../templates/gestion/product_profile.html | 3 +- gestion/templates/gestion/products_list.html | 6 +-- gestion/templates/gestion/stocks.html | 41 ++++++++++++++ gestion/urls.py | 2 + gestion/views.py | 51 ++++++++++++------ staticfiles/stocks.js | 16 ++++++ templates/nav.html | 7 ++- 10 files changed, 161 insertions(+), 30 deletions(-) create mode 100644 gestion/migrations/0012_auto_20190827_2119.py create mode 100644 gestion/templates/gestion/stocks.html create mode 100644 staticfiles/stocks.js diff --git a/gestion/admin.py b/gestion/admin.py index 60d2035..95b9471 100644 --- a/gestion/admin.py +++ b/gestion/admin.py @@ -59,8 +59,8 @@ class ProductAdmin(SimpleHistoryAdmin): """ The admin class for :class:`Products `. """ - list_display = ('name', 'amount', 'is_active', 'category', 'adherentRequired', 'stockHold', 'stockBar', 'volume', 'deg') - ordering = ('name', 'amount', 'stockHold', 'stockBar', 'deg') + list_display = ('name', 'amount', 'is_active', 'category', 'adherentRequired', 'stock', 'volume', 'deg') + ordering = ('name', 'amount', 'stock', 'deg') search_fields = ('name',) list_filter = ('is_active', 'adherentRequired', 'category') diff --git a/gestion/migrations/0012_auto_20190827_2119.py b/gestion/migrations/0012_auto_20190827_2119.py new file mode 100644 index 0000000..15a104d --- /dev/null +++ b/gestion/migrations/0012_auto_20190827_2119.py @@ -0,0 +1,53 @@ +# Generated by Django 2.1 on 2019-08-27 19:19 + +from django.db import migrations, models + +def update(apps, schema_editor): + Product = apps.get_model('gestion', 'Product') + for product in Product.objects.all(): + product.stock = product.stockBar + product.save() + +def reverse(apps, schema_editor): + Product = apps.get_model('gestion', 'Product') + for product in Product.objects.all(): + product.stockBar = product.stock + product.save() + + + +class Migration(migrations.Migration): + + dependencies = [ + ('gestion', '0011_auto_20190623_1640'), + ] + + operations = [ + migrations.AddField( + model_name='historicalproduct', + name='stock', + field=models.IntegerField(default=0, verbose_name='Stock'), + ), + migrations.AddField( + model_name='product', + name='stock', + field=models.IntegerField(default=0, verbose_name='Stock'), + ), + migrations.RunPython(update, reverse), + migrations.RemoveField( + model_name='historicalproduct', + name='stockBar', + ), + migrations.RemoveField( + model_name='historicalproduct', + name='stockHold', + ), + migrations.RemoveField( + model_name='product', + name='stockBar', + ), + migrations.RemoveField( + model_name='product', + name='stockHold', + ), + ] diff --git a/gestion/models.py b/gestion/models.py index fd4278d..64267d2 100644 --- a/gestion/models.py +++ b/gestion/models.py @@ -54,13 +54,9 @@ class Product(models.Model): """ The price of the product. """ - stockHold = models.IntegerField(default=0, verbose_name="Stock en soute") + stock = models.IntegerField(default=0, verbose_name="Stock") """ - Number of product in the hold. - """ - stockBar = models.IntegerField(default=0, verbose_name="Stock en bar") - """ - Number of product at the bar. + Number of product """ category = models.ForeignKey('Category', on_delete=models.PROTECT, verbose_name="Catégorie") """ diff --git a/gestion/templates/gestion/product_profile.html b/gestion/templates/gestion/product_profile.html index d3e81f9..b9dde04 100644 --- a/gestion/templates/gestion/product_profile.html +++ b/gestion/templates/gestion/product_profile.html @@ -14,8 +14,7 @@ {% if perms.gestion.change_product %}{% if product.is_active %}Désa{% else %}A{% endif %}ctiver Modifier
{% endif %}
Nom : {{ product.name }}
Prix de vente : {{ product.amount }}€
- Stock en soute : {{ product.stockHold }}
- Stock au bar : {{ product.stockBar }}
+ Stock en soute : {{ product.stock }}
Catégorie : {{ product.category }}
Actif : {{ product.is_active | yesno:"Oui, Non"}}
Dégré : {{ product.deg }}
diff --git a/gestion/templates/gestion/products_list.html b/gestion/templates/gestion/products_list.html index 3d8d1f6..2a0aa44 100644 --- a/gestion/templates/gestion/products_list.html +++ b/gestion/templates/gestion/products_list.html @@ -19,8 +19,7 @@ Nom Prix - Stock (soute) - Stock (bar) + Stock Catégorie Actif Degré @@ -33,8 +32,7 @@ {{ product.name }} {{ product.amount}} - {{ product.stockHold }} - {{ product.stockBar }} + {{ product.stock }} {{ product.category }} {{ product.is_active | yesno:"Oui, Non"}} {{ product.deg }} diff --git a/gestion/templates/gestion/stocks.html b/gestion/templates/gestion/stocks.html new file mode 100644 index 0000000..82f0671 --- /dev/null +++ b/gestion/templates/gestion/stocks.html @@ -0,0 +1,41 @@ +{% extends 'base.html' %} +{% load static %} +{% block entete %}Gestion des produits{% endblock %} +{% block navbar%} + +{% endblock %} +{% block content %} +{% for category in categories %} +
+
+

Stocks {{category}}

+
+
+ + + + + + + + + + {% for product in category.active_products %} + + + + + + {% endfor %} + +
NomStockMettre à jour
{{ product.name }}{{ product.stock }}
+
+
+{% endfor %} + + +{% endblock %} diff --git a/gestion/urls.py b/gestion/urls.py index c5c777f..bb1734f 100644 --- a/gestion/urls.py +++ b/gestion/urls.py @@ -55,4 +55,6 @@ urlpatterns = [ path('divide', views.divide, name="divide"), path('gen_invoice', views.gen_invoice, name="gen_invoice"), path('compute-price', views.compute_price_view, name="compute-price"), + path('stocks', views.stocks, name="stocks"), + path('updateStock/', views.update_stock, name="updateStock"), ] \ No newline at end of file diff --git a/gestion/views.py b/gestion/views.py index 1ec41b1..f8e4bed 100644 --- a/gestion/views.py +++ b/gestion/views.py @@ -161,12 +161,11 @@ def order(request): kegHistory.amountSold += Decimal(quantity * product.amount) kegHistory.save() else: - if(product.stockBar > quantity): - product.stockBar -= quantity + if(product.stock > quantity): + product.stock -= quantity product.save() else: - product.stockBar = 0 - product.save() + raise Exception("Le stock du produit n'autorise pas l'opération") consumption, _ = Consumption.objects.get_or_create(customer=user, product=product) consumption.quantity += quantity consumption.save() @@ -198,12 +197,11 @@ def order(request): consumption, _ = Consumption.objects.get_or_create(customer=user, product=article) consumption.quantity += quantity consumption.save() - if(article.stockBar > quantity): - article.stockBar -= quantity + if(article.stock > quantity): + article.stock -= quantity article.save() else: - article.stockBar = 0 - article.save() + raise Exception("Le stock du produit " + article.name + "n'autorise pas l'opération") user.profile.alcohol += Decimal(quantity * float(product.deg) * product.volume * 0.79 /10 /1000) user.save() return HttpResponse("La commande a bien été effectuée") @@ -288,6 +286,7 @@ def cancel_consumption(request, pk): """ consumption = get_object_or_404(ConsumptionHistory, pk=pk) user = consumption.customer + product = consumption.product if consumption.paymentMethod.affect_balance: user.profile.debit -= consumption.amount else: @@ -297,6 +296,8 @@ def cancel_consumption(request, pk): consumptionT = Consumption.objects.get(customer=user, product=consumption.product) consumptionT.quantity -= consumption.quantity consumptionT.save() + product.stock += consumption.quantity + product.save() consumption.delete() messages.success(request, "La consommation a bien été annulée") return redirect(reverse('users:profile', kwargs={'pk': user.pk})) @@ -317,7 +318,9 @@ def cancel_menu(request, pk): user.profile.debit -= menu_history.amount else: user.profile.direct_debit -= menu_history.amount - for product in manu_history.menu.articles: + for product in menu_history.menu.articles: + product.stock += menu_history.quantity + product.save() consumptionT = Consumption.objects.get(customer=user, product=product) consumptionT -= menu_history.quantity consumptionT.save() @@ -328,6 +331,7 @@ def cancel_menu(request, pk): return redirect(reverse('users:profile', kwargs={'pk': user.pk})) ########## Products ########## + @active_required @login_required @acl_or('gestion.add_product', 'gestion.view_product', 'gestion.add_keg', 'gestion.view_keg', 'gestion.change_keg', 'gestion.view_menu', 'gestion.add_menu') @@ -457,6 +461,26 @@ class ActiveProductsAutocomplete(autocomplete.Select2QuerySetView): qs = qs.filter(name__icontains=self.q) return qs +@active_required +@login_required +@permission_required('gestion.change_product') +def update_stock(request, pk): + product = get_object_or_404(Product, pk=pk) + if("stock" in request.GET): + product.stock = request.GET.get("stock") + product.save() + return HttpResponse("Le stock a bien été mis à jour") + +@active_required +@login_required +@permission_required('gestion.change_product') +def stocks(request): + """ + View to update stocks of active products + """ + categories = Category.objects.exclude(order=0).order_by("order") + return render(request, "gestion/stocks.html", {"categories": categories}) + ########## Kegs ########## @active_required @@ -477,8 +501,7 @@ def addKeg(request): pinte = Product( name = "Pinte " + name, amount = pinte_price, - stockHold = 0, - stockBar = 0, + stock = 0, category = form.cleaned_data["category"], needQuantityButton = False, is_active = True, @@ -493,8 +516,7 @@ def addKeg(request): demi = Product( name = "Demi " + name, amount = ceil(5*pinte_price)/10, - stockHold = 0, - stockBar = 0, + stock = 0, category = form.cleaned_data["category"], needQuantityButton = False, is_active = True, @@ -510,8 +532,7 @@ def addKeg(request): galopin = Product( name = "Galopin " + name, amount = ceil(2.5 * pinte_price)/10, - stockHold = 0, - stockBar = 0, + stock = 0, category = form.cleaned_data["category"], needQuantityButton = False, is_active = True, diff --git a/staticfiles/stocks.js b/staticfiles/stocks.js new file mode 100644 index 0000000..05c0f60 --- /dev/null +++ b/staticfiles/stocks.js @@ -0,0 +1,16 @@ +$(document).ready(function(){ + $(".update-stock").click(function(){ + var pk = $(this).attr('data-pk'); + var current_value = $(this).attr('data-stock'); + var ok = false; + while(!ok){ + var new_stock = prompt("Nouveau stock ? (entier attendu)", current_value); + ok = new_stock == null || !(isNaN(parseInt(new_stock))); + } + if(new_stock != null){ + $.get("/gestion/updateStock/" + pk, {"stock": new_stock}, function(data){ + $("#stock-"+pk).html(new_stock); + }); + } + }); +}); \ No newline at end of file diff --git a/templates/nav.html b/templates/nav.html index 876d1bd..c8583bd 100644 --- a/templates/nav.html +++ b/templates/nav.html @@ -20,8 +20,13 @@ Gestion des produits
{% endif %} +{% if perms.gestion.change_product %} + +
+ Stocks +
+{% endif %} -
Classement
{% if perms.preferences.change_generalpreferences %} From d442545d1707fa5ab66820e12ec033e2d98de79d Mon Sep 17 00:00:00 2001 From: nanoy Date: Wed, 28 Aug 2019 12:34:11 +0200 Subject: [PATCH 5/6] Add command gencontributors and fix about page --- .gitignore | 1 + coopeV3/management/commands/gencontributors.py | 15 +++++++++++++++ coopeV3/views.py | 13 ++++++------- templates/about.html | 6 ++++-- 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 coopeV3/management/commands/gencontributors.py diff --git a/.gitignore b/.gitignore index 6cfebb4..8a02841 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,4 @@ static/ Pipfile mediafiles Pipfile.lock +contributors.txt diff --git a/coopeV3/management/commands/gencontributors.py b/coopeV3/management/commands/gencontributors.py new file mode 100644 index 0000000..a8850bc --- /dev/null +++ b/coopeV3/management/commands/gencontributors.py @@ -0,0 +1,15 @@ +from django.core.management.base import BaseCommand, CommandError +from django.conf import settings + +import subprocess + +class Command(BaseCommand): + help = 'Generate the git contributors file' + + def handle(self, *args, **options): + try: + subprocess.call("rm " + settings.BASE_DIR + "/contributors.txt", shell=True) + except: + pass + subprocess.call("git -C " + settings.BASE_DIR + " shortlog -n $@ | grep \"):\" | sed 's|:||' >> " + settings.BASE_DIR + "/contributors.txt", shell=True) + subprocess.call("cat " + settings.BASE_DIR + "/contributors.txt", shell=True) \ No newline at end of file diff --git a/coopeV3/views.py b/coopeV3/views.py index e9108b8..e04eec0 100644 --- a/coopeV3/views.py +++ b/coopeV3/views.py @@ -44,14 +44,13 @@ def about(request): """ A page about the project """ - os.system("git -C " + settings.BASE_DIR + " shortlog -n $@ | grep \"):\" | sed 's|:||' >> " + settings.BASE_DIR + "/contributors.txt") contributors = [] - with open(settings.BASE_DIR + "/contributors.txt", "r") as f: - for line in f: - print(line) - print(line.split(" ")[0]) - contributors.append((line.split(" ")[0], int(line.split(" ")[1].replace("(", "").replace(")", "").replace("\n", "")))) - os.system("rm " + settings.BASE_DIR + "/contributors.txt") + try: + with open(settings.BASE_DIR + "/contributors.txt", "r") as f: + for line in f: + contributors.append((line[:line.find('(')], int(line[(line.find('(') + 1):line.find(')')]))) + except: + pass license = [] with open(settings.BASE_DIR + "/LICENSE", "r") as f: for line in f: diff --git a/templates/about.html b/templates/about.html index 8623bfe..6aaf994 100644 --- a/templates/about.html +++ b/templates/about.html @@ -28,8 +28,6 @@ {% endfor %} (https://github.com/nanoy42/coope/blob/master/LICENSE).

- - Version 3.6.2.
@@ -37,12 +35,16 @@

Contributeurs

+ {% if contributors %} Les contributeurs, triés par ordre décroissant de nombre de commits, sont:
    {% for contributor in contributors %}
  1. {{contributor.0}} ({{contributor.1}} commits)
  2. {% endfor %}
+ {% else %} + Impossible d'afficher la liste des contributeurs + {% endif %}
{% endblock %} From 432169d2bac2d9ca93187e3d450ddcf75b6dd3f2 Mon Sep 17 00:00:00 2001 From: nanoy Date: Wed, 28 Aug 2019 12:37:53 +0200 Subject: [PATCH 6/6] Update version info --- CHANGELOG.md | 5 +++++ templates/footer.html | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bad4c8..6452260 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v3.6.3 +* Refonte totale du système de stocks +* Fix price profile +* Rajoute un nombre de citations sur la page de statistiques +* Fix les contributeurs sur la page about et gencontributors en commande ## v3.6.2 * Fix sur les prix des cotisations. * Page À propose diff --git a/templates/footer.html b/templates/footer.html index cad542c..c45aa08 100644 --- a/templates/footer.html +++ b/templates/footer.html @@ -42,6 +42,6 @@
  • Facebook
  • - +