From f4fe0c98666f87ef79b48200706733d36c0f8840 Mon Sep 17 00:00:00 2001 From: Pierre-antoine Comby Date: Mon, 9 Mar 2020 20:59:04 +0100 Subject: [PATCH 01/84] use django_tables2 for transactionTemplate --- apps/note/tables.py | 11 ++++++++++ apps/note/views.py | 8 ++++--- templates/note/transactiontemplate_list.html | 22 +++----------------- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/apps/note/tables.py b/apps/note/tables.py index e85fcbae..580cb91d 100644 --- a/apps/note/tables.py +++ b/apps/note/tables.py @@ -54,3 +54,14 @@ class AliasTable(tables.Table): 'td': {'class': 'col-sm-2'}, 'a': {'class': 'btn btn-danger'}}, text='delete', accessor='pk') + +class ButtonTable(tables.Table): + class Meta: + attrs = { + 'class': + 'table table condensed table-striped table-hover' + } + model = TransactionTemplate + + def render_amount(self, value): + return pretty_money(value) diff --git a/apps/note/views.py b/apps/note/views.py index 09846057..a3441ab3 100644 --- a/apps/note/views.py +++ b/apps/note/views.py @@ -8,9 +8,11 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ from django.views.generic import CreateView, ListView, UpdateView +from django_tables2 import SingleTableView + from .forms import TransactionForm, TransactionTemplateForm, ConsoForm from .models import Transaction, TransactionTemplate, Alias, TemplateTransaction - +from .tables import ButtonTable class TransactionCreate(LoginRequiredMixin, CreateView): """ @@ -106,12 +108,12 @@ class TransactionTemplateCreateView(LoginRequiredMixin, CreateView): form_class = TransactionTemplateForm -class TransactionTemplateListView(LoginRequiredMixin, ListView): +class TransactionTemplateListView(LoginRequiredMixin, SingleTableView): """ List TransactionsTemplates """ model = TransactionTemplate - form_class = TransactionTemplateForm + table = ButtonTable class TransactionTemplateUpdateView(LoginRequiredMixin, UpdateView): diff --git a/templates/note/transactiontemplate_list.html b/templates/note/transactiontemplate_list.html index 62e4d164..e8881988 100644 --- a/templates/note/transactiontemplate_list.html +++ b/templates/note/transactiontemplate_list.html @@ -1,23 +1,7 @@ {% extends "base.html" %} {% load pretty_money %} +{% load render_table from django_tables2 %} {% block content %} - - - - - - - - -{% for object in object_list %} - - - - - - - -{% endfor %} -
IDNomDestinataireMontantCatégorie
{{object.pk}}{{ object.name }}{{ object.destination }}{{ object.amount | pretty_money }}{{ object.template_type }}
-Créer un bouton +Créer un bouton +{% render_table table %} {% endblock %} From 8abc7898957196c5860f3c82d127b60a360e4d98 Mon Sep 17 00:00:00 2001 From: Pierre-antoine Comby Date: Tue, 10 Mar 2020 20:17:56 +0100 Subject: [PATCH 02/84] fix parameter name, works better. --- apps/note/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/note/views.py b/apps/note/views.py index a3441ab3..e0105140 100644 --- a/apps/note/views.py +++ b/apps/note/views.py @@ -113,7 +113,7 @@ class TransactionTemplateListView(LoginRequiredMixin, SingleTableView): List TransactionsTemplates """ model = TransactionTemplate - table = ButtonTable + table_class = ButtonTable class TransactionTemplateUpdateView(LoginRequiredMixin, UpdateView): From 71346476dfa494bf083aaf494408b49b95ba87ad Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 21 Mar 2020 00:30:49 +0100 Subject: [PATCH 03/84] Starting treasury app --- apps/treasury/__init__.py | 0 apps/treasury/api/__init__.py | 0 apps/treasury/apps.py | 11 +++ apps/treasury/migrations/__init__.py | 0 apps/treasury/models.py | 113 +++++++++++++++++++++++++++ apps/treasury/tables.py | 20 +++++ apps/treasury/urls.py | 11 +++ apps/treasury/views.py | 16 ++++ note_kfet/settings/base.py | 1 + note_kfet/urls.py | 1 + templates/base.html | 3 + templates/treasury/billing_list.html | 21 +++++ 12 files changed, 197 insertions(+) create mode 100644 apps/treasury/__init__.py create mode 100644 apps/treasury/api/__init__.py create mode 100644 apps/treasury/apps.py create mode 100644 apps/treasury/migrations/__init__.py create mode 100644 apps/treasury/models.py create mode 100644 apps/treasury/tables.py create mode 100644 apps/treasury/urls.py create mode 100644 apps/treasury/views.py create mode 100644 templates/treasury/billing_list.html diff --git a/apps/treasury/__init__.py b/apps/treasury/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/treasury/api/__init__.py b/apps/treasury/api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/treasury/apps.py b/apps/treasury/apps.py new file mode 100644 index 00000000..5f7f6dc9 --- /dev/null +++ b/apps/treasury/apps.py @@ -0,0 +1,11 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.apps import AppConfig +from django.db.models.signals import pre_save, post_save, post_delete +from django.utils.translation import gettext_lazy as _ + + +class TreasuryConfig(AppConfig): + name = 'treasury' + verbose_name = _('Treasury') diff --git a/apps/treasury/migrations/__init__.py b/apps/treasury/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/treasury/models.py b/apps/treasury/models.py new file mode 100644 index 00000000..51974ec0 --- /dev/null +++ b/apps/treasury/models.py @@ -0,0 +1,113 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class Billing(models.Model): + id = models.PositiveIntegerField( + primary_key=True, + verbose_name=_("Billing identifier"), + ) + + subject = models.CharField( + max_length=255, + verbose_name=_("Subject"), + ) + + description = models.TextField( + verbose_name=_("Description") + ) + + name = models.CharField( + max_length=255, + verbose_name=_("Name"), + ) + + address = models.TextField( + verbose_name=_("Address"), + ) + + date = models.DateField( + auto_now_add=True, + verbose_name=_("Place"), + ) + + acquitted = models.BooleanField( + verbose_name=_("Acquitted"), + ) + + place = models.CharField( + max_length=255, + default="Cachan", + verbose_name=_("Place"), + ) + + my_name = models.CharField( + max_length=255, + default="BDE ENS Cachan", + verbose_name=_("My name"), + ) + + my_address_street = models.CharField( + max_length=255, + default="61 avenue du Président Wilson", + verbose_name=_("My street address"), + ) + + my_city = models.CharField( + max_length=255, + default="94230 Cachan", + verbose_name=_("My city"), + ) + + bank_code = models.IntegerField( + default=30003, + verbose_name=_("Bank code"), + ) + + desk_code = models.IntegerField( + default=3894, + verbose_name=_("Desk code"), + ) + + account_number = models.IntegerField( + default=37280662, + verbose_name=_("Account number"), + ) + + rib_key = models.SmallIntegerField( + default=14, + verbose_name=_("RIB Key") + ) + + bic = models.CharField( + max_length=16, + default="SOGEFRPP", + verbose_name=_("BIC Code") + ) + + +class Product(models.Model): + billing = models.ForeignKey( + Billing, + on_delete=models.PROTECT, + ) + + designation = models.CharField( + max_length=255, + verbose_name=_("Designation"), + ) + + quantity = models.PositiveIntegerField( + verbose_name=_("Quantity") + ) + + amount = models.PositiveIntegerField( + verbose_name=_("Unit price") + ) + + @property + def total(self): + return self.quantity * self.amount diff --git a/apps/treasury/tables.py b/apps/treasury/tables.py new file mode 100644 index 00000000..b0b4f1db --- /dev/null +++ b/apps/treasury/tables.py @@ -0,0 +1,20 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django_tables2 import tables + +from .models import Billing + + +class BillingTable(tables.Table): + class Meta: + attrs = { + 'class': 'table table-condensed table-striped table-hover' + } + model = Billing + template_name = 'django_tables2/bootstrap4.html' + fields = ('id', 'name', 'subject', 'acquitted', ) + row_attrs = { + 'class': 'table-row', + 'data-href': lambda record: record.pk + } \ No newline at end of file diff --git a/apps/treasury/urls.py b/apps/treasury/urls.py new file mode 100644 index 00000000..7cd68ec0 --- /dev/null +++ b/apps/treasury/urls.py @@ -0,0 +1,11 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.urls import path + +from .views import BillingListView + +app_name = 'treasury' +urlpatterns = [ + path('billing/', BillingListView.as_view(), name='billing'), +] diff --git a/apps/treasury/views.py b/apps/treasury/views.py new file mode 100644 index 00000000..435f8cdb --- /dev/null +++ b/apps/treasury/views.py @@ -0,0 +1,16 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.contrib.auth.mixins import LoginRequiredMixin +from django_tables2 import SingleTableView + +from .models import Billing +from .tables import BillingTable + + +class BillingListView(LoginRequiredMixin, SingleTableView): + """ + List existing Billings + """ + model = Billing + table_class = BillingTable diff --git a/note_kfet/settings/base.py b/note_kfet/settings/base.py index 0694390d..d85071c5 100644 --- a/note_kfet/settings/base.py +++ b/note_kfet/settings/base.py @@ -61,6 +61,7 @@ INSTALLED_APPS = [ 'activity', 'member', 'note', + 'treasury', 'api', 'logs', ] diff --git a/note_kfet/urls.py b/note_kfet/urls.py index da2f9d6c..80808bbe 100644 --- a/note_kfet/urls.py +++ b/note_kfet/urls.py @@ -13,6 +13,7 @@ urlpatterns = [ # Include project routers path('note/', include('note.urls')), + path('treasury/', include('treasury.urls')), # Include Django Contrib and Core routers path('i18n/', include('django.conf.urls.i18n')), diff --git a/templates/base.html b/templates/base.html index d57dab89..88ad67f9 100644 --- a/templates/base.html +++ b/templates/base.html @@ -81,6 +81,9 @@ SPDX-License-Identifier: GPL-3.0-or-later + diff --git a/templates/treasury/billing_form.html b/templates/treasury/invoice_form.html similarity index 95% rename from templates/treasury/billing_form.html rename to templates/treasury/invoice_form.html index 9c1416ed..2177d0f7 100644 --- a/templates/treasury/billing_form.html +++ b/templates/treasury/invoice_form.html @@ -3,7 +3,7 @@ {% load i18n %} {% load crispy_forms_tags pretty_money %} {% block content %} -

{% trans "Billings list" %}

+

{% trans "Invoices list" %}

{% csrf_token %} {% crispy form %} @@ -31,7 +31,7 @@ - {{ form.billing }} + {{ form.invoice }} {{ form.id }} {% endfor %} @@ -63,7 +63,7 @@ - {{ formset.empty_form.billing }} + {{ formset.empty_form.invoice }} {{ formset.empty_form.id }} diff --git a/templates/treasury/billing_list.html b/templates/treasury/invoice_list.html similarity index 59% rename from templates/treasury/billing_list.html rename to templates/treasury/invoice_list.html index 749c0767..f80e2342 100644 --- a/templates/treasury/billing_list.html +++ b/templates/treasury/invoice_list.html @@ -5,6 +5,6 @@ {% render_table table %} -{% trans "New billing" %} +{% trans "New invoice" %} {% endblock %} diff --git a/templates/treasury/billing_sample.tex b/templates/treasury/invoice_sample.tex similarity index 100% rename from templates/treasury/billing_sample.tex rename to templates/treasury/invoice_sample.tex From 70cf186233c889d15e71fb1f81da3eabcc0d973b Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 22 Mar 2020 14:12:45 +0100 Subject: [PATCH 15/84] Fix fixtures, another time... --- apps/note/fixtures/initial.json | 12 ++--- apps/permission/fixtures/initial.json | 66 +++++++++++++-------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/apps/note/fixtures/initial.json b/apps/note/fixtures/initial.json index 3654fa2f..119e1c28 100644 --- a/apps/note/fixtures/initial.json +++ b/apps/note/fixtures/initial.json @@ -3,7 +3,7 @@ "model": "note.note", "pk": 1, "fields": { - "polymorphic_ctype": 40, + "polymorphic_ctype": 23, "balance": 0, "is_active": true, "display_image": "", @@ -14,7 +14,7 @@ "model": "note.note", "pk": 2, "fields": { - "polymorphic_ctype": 40, + "polymorphic_ctype": 23, "balance": 0, "is_active": true, "display_image": "", @@ -25,7 +25,7 @@ "model": "note.note", "pk": 3, "fields": { - "polymorphic_ctype": 40, + "polymorphic_ctype": 23, "balance": 0, "is_active": true, "display_image": "", @@ -36,7 +36,7 @@ "model": "note.note", "pk": 4, "fields": { - "polymorphic_ctype": 40, + "polymorphic_ctype": 23, "balance": 0, "is_active": true, "display_image": "", @@ -47,7 +47,7 @@ "model": "note.note", "pk": 5, "fields": { - "polymorphic_ctype": 39, + "polymorphic_ctype": 22, "balance": 0, "is_active": true, "display_image": "", @@ -58,7 +58,7 @@ "model": "note.note", "pk": 6, "fields": { - "polymorphic_ctype": 39, + "polymorphic_ctype": 22, "balance": 0, "is_active": true, "display_image": "", diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index 69900372..da1fa486 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -83,7 +83,7 @@ "model": "permission.permission", "pk": 1, "fields": { - "model": 21, + "model": 4, "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "view", "mask": 1, @@ -95,7 +95,7 @@ "model": "permission.permission", "pk": 2, "fields": { - "model": 31, + "model": 14, "query": "{\"user\": [\"user\"]}", "type": "view", "mask": 1, @@ -107,7 +107,7 @@ "model": "permission.permission", "pk": 3, "fields": { - "model": 34, + "model": 24, "query": "{\"pk\": [\"user\", \"note\", \"pk\"]}", "type": "view", "mask": 1, @@ -119,7 +119,7 @@ "model": "permission.permission", "pk": 4, "fields": { - "model": 25, + "model": 8, "query": "{\"user\": [\"user\"]}", "type": "view", "mask": 1, @@ -131,7 +131,7 @@ "model": "permission.permission", "pk": 5, "fields": { - "model": 36, + "model": 19, "query": "[\"OR\", {\"source\": [\"user\", \"note\"]}, {\"destination\": [\"user\", \"note\"]}]", "type": "view", "mask": 1, @@ -143,7 +143,7 @@ "model": "permission.permission", "pk": 6, "fields": { - "model": 33, + "model": 16, "query": "[\"OR\", {\"note__in\": [\"NoteUser\", \"objects\", [\"filter\", {\"user__membership__club__name\": \"Kfet\"}], [\"all\"]]}, {\"note__in\": [\"NoteClub\", \"objects\", [\"all\"]]}]", "type": "view", "mask": 1, @@ -155,7 +155,7 @@ "model": "permission.permission", "pk": 7, "fields": { - "model": 21, + "model": 4, "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -167,7 +167,7 @@ "model": "permission.permission", "pk": 8, "fields": { - "model": 21, + "model": 4, "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -179,7 +179,7 @@ "model": "permission.permission", "pk": 9, "fields": { - "model": 21, + "model": 4, "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -191,7 +191,7 @@ "model": "permission.permission", "pk": 10, "fields": { - "model": 21, + "model": 4, "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -203,7 +203,7 @@ "model": "permission.permission", "pk": 11, "fields": { - "model": 21, + "model": 4, "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -215,7 +215,7 @@ "model": "permission.permission", "pk": 12, "fields": { - "model": 25, + "model": 8, "query": "{\"user\": [\"user\"]}", "type": "delete", "mask": 1, @@ -227,7 +227,7 @@ "model": "permission.permission", "pk": 13, "fields": { - "model": 25, + "model": 8, "query": "{\"user\": [\"user\"]}", "type": "add", "mask": 1, @@ -239,7 +239,7 @@ "model": "permission.permission", "pk": 14, "fields": { - "model": 33, + "model": 16, "query": "{\"note\": [\"user\", \"note\"]}", "type": "delete", "mask": 1, @@ -251,7 +251,7 @@ "model": "permission.permission", "pk": 15, "fields": { - "model": 33, + "model": 16, "query": "{\"note\": [\"user\", \"note\"]}", "type": "add", "mask": 1, @@ -263,7 +263,7 @@ "model": "permission.permission", "pk": 16, "fields": { - "model": 34, + "model": 24, "query": "{\"pk\": [\"user\", \"note\", \"pk\"]}", "type": "change", "mask": 1, @@ -275,7 +275,7 @@ "model": "permission.permission", "pk": 17, "fields": { - "model": 36, + "model": 19, "query": "[\"AND\", {\"source\": [\"user\", \"note\"]}, {\"amount__lte\": [\"user\", \"note\", \"balance\"]}]", "type": "add", "mask": 1, @@ -287,7 +287,7 @@ "model": "permission.permission", "pk": 18, "fields": { - "model": 34, + "model": 17, "query": "{}", "type": "change", "mask": 1, @@ -299,7 +299,7 @@ "model": "permission.permission", "pk": 19, "fields": { - "model": 34, + "model": 17, "query": "[\"OR\", {\"pk\": [\"club\", \"note\", \"pk\"]}, {\"pk__in\": [\"NoteUser\", \"objects\", [\"filter\", {\"user__membership__club\": [\"club\"]}], [\"all\"]]}]", "type": "view", "mask": 2, @@ -311,7 +311,7 @@ "model": "permission.permission", "pk": 20, "fields": { - "model": 36, + "model": 19, "query": "[\"AND\", [\"OR\", {\"source\": [\"club\", \"note\"]}, {\"destination\": [\"club\", \"note\"]}], {\"amount__lte\": {\"F\": [\"ADD\", [\"F\", \"source__balance\"], 5000]}}]", "type": "add", "mask": 2, @@ -323,7 +323,7 @@ "model": "permission.permission", "pk": 21, "fields": { - "model": 42, + "model": 25, "query": "[\"AND\", {\"destination\": [\"club\", \"note\"]}, {\"amount__lte\": {\"F\": [\"ADD\", [\"F\", \"source__balance\"], 5000]}}]", "type": "add", "mask": 2, @@ -335,7 +335,7 @@ "model": "permission.permission", "pk": 22, "fields": { - "model": 29, + "model": 12, "query": "{\"pk\": [\"club\", \"pk\"]}", "type": "view", "mask": 1, @@ -347,7 +347,7 @@ "model": "permission.permission", "pk": 23, "fields": { - "model": 36, + "model": 19, "query": "{}", "type": "change", "mask": 1, @@ -359,7 +359,7 @@ "model": "permission.permission", "pk": 24, "fields": { - "model": 36, + "model": 19, "query": "{}", "type": "view", "mask": 2, @@ -371,7 +371,7 @@ "model": "permission.permission", "pk": 25, "fields": { - "model": 40, + "model": 23, "query": "{}", "type": "view", "mask": 2, @@ -383,7 +383,7 @@ "model": "permission.permission", "pk": 26, "fields": { - "model": 43, + "model": 26, "query": "{}", "type": "add", "mask": 2, @@ -395,7 +395,7 @@ "model": "permission.permission", "pk": 27, "fields": { - "model": 35, + "model": 18, "query": "{}", "type": "view", "mask": 2, @@ -407,7 +407,7 @@ "model": "permission.permission", "pk": 28, "fields": { - "model": 35, + "model": 18, "query": "{}", "type": "change", "mask": 3, @@ -419,7 +419,7 @@ "model": "permission.permission", "pk": 29, "fields": { - "model": 35, + "model": 18, "query": "{}", "type": "add", "mask": 3, @@ -431,7 +431,7 @@ "model": "permission.permission", "pk": 30, "fields": { - "model": 37, + "model": 20, "query": "{}", "type": "view", "mask": 2, @@ -443,7 +443,7 @@ "model": "permission.permission", "pk": 31, "fields": { - "model": 37, + "model": 20, "query": "{}", "type": "add", "mask": 3, @@ -455,7 +455,7 @@ "model": "permission.permission", "pk": 32, "fields": { - "model": 37, + "model": 20, "query": "{}", "type": "change", "mask": 3, @@ -467,7 +467,7 @@ "model": "permission.permission", "pk": 33, "fields": { - "model": 36, + "model": 19, "query": "{}", "type": "add", "mask": 2, From c941585850afffe6679b162279fc2387929e63aa Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 22 Mar 2020 14:15:19 +0100 Subject: [PATCH 16/84] Fix production installation --- requirements/production.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/production.txt b/requirements/production.txt index f0b52228..fe939cce 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -1 +1 @@ -psycopg2==2.8.4 +psycopg2-binary==2.8.4 From 1e5065b80bb39a9b322c853ec2b6a117f10b3240 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 22 Mar 2020 14:54:05 +0100 Subject: [PATCH 17/84] Fixtures are more natural --- apps/note/fixtures/initial.json | 475 ++++++++++++++------------ apps/permission/fixtures/initial.json | 165 +++++++-- 2 files changed, 389 insertions(+), 251 deletions(-) diff --git a/apps/note/fixtures/initial.json b/apps/note/fixtures/initial.json index 119e1c28..a0682dae 100644 --- a/apps/note/fixtures/initial.json +++ b/apps/note/fixtures/initial.json @@ -1,220 +1,259 @@ [ - { - "model": "note.note", - "pk": 1, - "fields": { - "polymorphic_ctype": 23, - "balance": 0, - "is_active": true, - "display_image": "", - "created_at": "2020-02-20T20:02:48.778Z" - } - }, - { - "model": "note.note", - "pk": 2, - "fields": { - "polymorphic_ctype": 23, - "balance": 0, - "is_active": true, - "display_image": "", - "created_at": "2020-02-20T20:06:39.546Z" - } - }, - { - "model": "note.note", - "pk": 3, - "fields": { - "polymorphic_ctype": 23, - "balance": 0, - "is_active": true, - "display_image": "", - "created_at": "2020-02-20T20:06:43.049Z" - } - }, - { - "model": "note.note", - "pk": 4, - "fields": { - "polymorphic_ctype": 23, - "balance": 0, - "is_active": true, - "display_image": "", - "created_at": "2020-02-20T20:06:50.996Z" - } - }, - { - "model": "note.note", - "pk": 5, - "fields": { - "polymorphic_ctype": 22, - "balance": 0, - "is_active": true, - "display_image": "", - "created_at": "2020-02-20T20:09:38.615Z" - } - }, - { - "model": "note.note", - "pk": 6, - "fields": { - "polymorphic_ctype": 22, - "balance": 0, - "is_active": true, - "display_image": "", - "created_at": "2020-02-20T20:16:14.753Z" - } - }, - { - "model": "note.notespecial", - "pk": 1, - "fields": { - "special_type": "Esp\u00e8ces" - } - }, - { - "model": "note.notespecial", - "pk": 2, - "fields": { - "special_type": "Carte bancaire" - } - }, - { - "model": "note.notespecial", - "pk": 3, - "fields": { - "special_type": "Ch\u00e8que" - } - }, - { - "model": "note.notespecial", - "pk": 4, - "fields": { - "special_type": "Virement bancaire" - } - }, - { - "model": "note.noteclub", - "pk": 5, - "fields": { - "club": 1 - } - }, - { - "model": "note.noteclub", - "pk": 6, - "fields": { - "club": 2 - } - }, - { - "model": "note.alias", - "pk": 1, - "fields": { - "name": "Esp\u00e8ces", - "normalized_name": "especes", - "note": 1 - } - }, - { - "model": "note.alias", - "pk": 2, - "fields": { - "name": "Carte bancaire", - "normalized_name": "cartebancaire", - "note": 2 - } - }, - { - "model": "note.alias", - "pk": 3, - "fields": { - "name": "Ch\u00e8que", - "normalized_name": "cheque", - "note": 3 - } - }, - { - "model": "note.alias", - "pk": 4, - "fields": { - "name": "Virement bancaire", - "normalized_name": "virementbancaire", - "note": 4 - } - }, - { - "model": "note.alias", - "pk": 5, - "fields": { - "name": "BDE", - "normalized_name": "bde", - "note": 5 - } - }, - { - "model": "note.alias", - "pk": 6, - "fields": { - "name": "Kfet", - "normalized_name": "kfet", - "note": 6 - } - }, - { - "model": "note.templatecategory", - "pk": 1, - "fields": { - "name": "Soft" - } - }, - { - "model": "note.templatecategory", - "pk": 2, - "fields": { - "name": "Pulls" - } - }, - { - "model": "note.templatecategory", - "pk": 3, - "fields": { - "name": "Gala" - } - }, - { - "model": "note.templatecategory", - "pk": 4, - "fields": { - "name": "Clubs" - } - }, - { - "model": "note.templatecategory", - "pk": 5, - "fields": { - "name": "Bouffe" - } - }, - { - "model": "note.templatecategory", - "pk": 6, - "fields": { - "name": "BDA" - } - }, - { - "model": "note.templatecategory", - "pk": 7, - "fields": { - "name": "Autre" - } - }, - { - "model": "note.templatecategory", - "pk": 8, - "fields": { - "name": "Alcool" - } + { + "model": "note.note", + "pk": 1, + "fields": { + "polymorphic_ctype": [ + "note", + "notespecial" + ], + "balance": 0, + "last_negative": null, + "is_active": true, + "display_image": "", + "created_at": "2020-02-20T20:02:48.778Z" } -] + }, + { + "model": "note.note", + "pk": 2, + "fields": { + "polymorphic_ctype": [ + "note", + "notespecial" + ], + "balance": 0, + "last_negative": null, + "is_active": true, + "display_image": "", + "created_at": "2020-02-20T20:06:39.546Z" + } + }, + { + "model": "note.note", + "pk": 3, + "fields": { + "polymorphic_ctype": [ + "note", + "notespecial" + ], + "balance": 0, + "last_negative": null, + "is_active": true, + "display_image": "", + "created_at": "2020-02-20T20:06:43.049Z" + } + }, + { + "model": "note.note", + "pk": 4, + "fields": { + "polymorphic_ctype": [ + "note", + "notespecial" + ], + "balance": 0, + "last_negative": null, + "is_active": true, + "display_image": "", + "created_at": "2020-02-20T20:06:50.996Z" + } + }, + { + "model": "note.note", + "pk": 5, + "fields": { + "polymorphic_ctype": [ + "note", + "noteclub" + ], + "balance": 0, + "last_negative": null, + "is_active": true, + "display_image": "", + "created_at": "2020-02-20T20:09:38.615Z" + } + }, + { + "model": "note.note", + "pk": 6, + "fields": { + "polymorphic_ctype": [ + "note", + "noteclub" + ], + "balance": 0, + "last_negative": null, + "is_active": true, + "display_image": "", + "created_at": "2020-02-20T20:16:14.753Z" + } + }, + { + "model": "note.note", + "pk": 7, + "fields": { + "polymorphic_ctype": [ + "note", + "noteuser" + ], + "balance": 0, + "last_negative": null, + "is_active": true, + "display_image": "pic/default.png", + "created_at": "2020-03-22T13:01:35.680Z" + } + }, + { + "model": "note.noteclub", + "pk": 5, + "fields": { + "club": 1 + } + }, + { + "model": "note.noteclub", + "pk": 6, + "fields": { + "club": 2 + } + }, + { + "model": "note.notespecial", + "pk": 1, + "fields": { + "special_type": "Esp\u00e8ces" + } + }, + { + "model": "note.notespecial", + "pk": 2, + "fields": { + "special_type": "Carte bancaire" + } + }, + { + "model": "note.notespecial", + "pk": 3, + "fields": { + "special_type": "Ch\u00e8que" + } + }, + { + "model": "note.notespecial", + "pk": 4, + "fields": { + "special_type": "Virement bancaire" + } + }, + { + "model": "note.alias", + "pk": 1, + "fields": { + "name": "Esp\u00e8ces", + "normalized_name": "especes", + "note": 1 + } + }, + { + "model": "note.alias", + "pk": 2, + "fields": { + "name": "Carte bancaire", + "normalized_name": "cartebancaire", + "note": 2 + } + }, + { + "model": "note.alias", + "pk": 3, + "fields": { + "name": "Ch\u00e8que", + "normalized_name": "cheque", + "note": 3 + } + }, + { + "model": "note.alias", + "pk": 4, + "fields": { + "name": "Virement bancaire", + "normalized_name": "virementbancaire", + "note": 4 + } + }, + { + "model": "note.alias", + "pk": 5, + "fields": { + "name": "BDE", + "normalized_name": "bde", + "note": 5 + } + }, + { + "model": "note.alias", + "pk": 6, + "fields": { + "name": "Kfet", + "normalized_name": "kfet", + "note": 6 + } + }, + { + "model": "note.templatecategory", + "pk": 1, + "fields": { + "name": "Soft" + } + }, + { + "model": "note.templatecategory", + "pk": 2, + "fields": { + "name": "Pulls" + } + }, + { + "model": "note.templatecategory", + "pk": 3, + "fields": { + "name": "Gala" + } + }, + { + "model": "note.templatecategory", + "pk": 4, + "fields": { + "name": "Clubs" + } + }, + { + "model": "note.templatecategory", + "pk": 5, + "fields": { + "name": "Bouffe" + } + }, + { + "model": "note.templatecategory", + "pk": 6, + "fields": { + "name": "BDA" + } + }, + { + "model": "note.templatecategory", + "pk": 7, + "fields": { + "name": "Autre" + } + }, + { + "model": "note.templatecategory", + "pk": 8, + "fields": { + "name": "Alcool" + } + } +] \ No newline at end of file diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index da1fa486..3ca2b248 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -83,7 +83,10 @@ "model": "permission.permission", "pk": 1, "fields": { - "model": 4, + "model": [ + "auth", + "user" + ], "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "view", "mask": 1, @@ -95,7 +98,10 @@ "model": "permission.permission", "pk": 2, "fields": { - "model": 14, + "model": [ + "member", + "profile" + ], "query": "{\"user\": [\"user\"]}", "type": "view", "mask": 1, @@ -107,7 +113,10 @@ "model": "permission.permission", "pk": 3, "fields": { - "model": 24, + "model": [ + "note", + "noteuser" + ], "query": "{\"pk\": [\"user\", \"note\", \"pk\"]}", "type": "view", "mask": 1, @@ -119,7 +128,10 @@ "model": "permission.permission", "pk": 4, "fields": { - "model": 8, + "model": [ + "authtoken", + "token" + ], "query": "{\"user\": [\"user\"]}", "type": "view", "mask": 1, @@ -131,7 +143,10 @@ "model": "permission.permission", "pk": 5, "fields": { - "model": 19, + "model": [ + "note", + "transaction" + ], "query": "[\"OR\", {\"source\": [\"user\", \"note\"]}, {\"destination\": [\"user\", \"note\"]}]", "type": "view", "mask": 1, @@ -143,7 +158,10 @@ "model": "permission.permission", "pk": 6, "fields": { - "model": 16, + "model": [ + "note", + "alias" + ], "query": "[\"OR\", {\"note__in\": [\"NoteUser\", \"objects\", [\"filter\", {\"user__membership__club__name\": \"Kfet\"}], [\"all\"]]}, {\"note__in\": [\"NoteClub\", \"objects\", [\"all\"]]}]", "type": "view", "mask": 1, @@ -155,7 +173,10 @@ "model": "permission.permission", "pk": 7, "fields": { - "model": 4, + "model": [ + "auth", + "user" + ], "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -167,7 +188,10 @@ "model": "permission.permission", "pk": 8, "fields": { - "model": 4, + "model": [ + "auth", + "user" + ], "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -179,7 +203,10 @@ "model": "permission.permission", "pk": 9, "fields": { - "model": 4, + "model": [ + "auth", + "user" + ], "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -191,7 +218,10 @@ "model": "permission.permission", "pk": 10, "fields": { - "model": 4, + "model": [ + "auth", + "user" + ], "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -203,7 +233,10 @@ "model": "permission.permission", "pk": 11, "fields": { - "model": 4, + "model": [ + "auth", + "user" + ], "query": "{\"pk\": [\"user\", \"pk\"]}", "type": "change", "mask": 1, @@ -215,7 +248,10 @@ "model": "permission.permission", "pk": 12, "fields": { - "model": 8, + "model": [ + "authtoken", + "token" + ], "query": "{\"user\": [\"user\"]}", "type": "delete", "mask": 1, @@ -227,7 +263,10 @@ "model": "permission.permission", "pk": 13, "fields": { - "model": 8, + "model": [ + "authtoken", + "token" + ], "query": "{\"user\": [\"user\"]}", "type": "add", "mask": 1, @@ -239,7 +278,10 @@ "model": "permission.permission", "pk": 14, "fields": { - "model": 16, + "model": [ + "note", + "alias" + ], "query": "{\"note\": [\"user\", \"note\"]}", "type": "delete", "mask": 1, @@ -251,7 +293,10 @@ "model": "permission.permission", "pk": 15, "fields": { - "model": 16, + "model": [ + "note", + "alias" + ], "query": "{\"note\": [\"user\", \"note\"]}", "type": "add", "mask": 1, @@ -263,7 +308,10 @@ "model": "permission.permission", "pk": 16, "fields": { - "model": 24, + "model": [ + "note", + "noteuser" + ], "query": "{\"pk\": [\"user\", \"note\", \"pk\"]}", "type": "change", "mask": 1, @@ -275,7 +323,10 @@ "model": "permission.permission", "pk": 17, "fields": { - "model": 19, + "model": [ + "note", + "transaction" + ], "query": "[\"AND\", {\"source\": [\"user\", \"note\"]}, {\"amount__lte\": [\"user\", \"note\", \"balance\"]}]", "type": "add", "mask": 1, @@ -287,7 +338,10 @@ "model": "permission.permission", "pk": 18, "fields": { - "model": 17, + "model": [ + "note", + "note" + ], "query": "{}", "type": "change", "mask": 1, @@ -299,7 +353,10 @@ "model": "permission.permission", "pk": 19, "fields": { - "model": 17, + "model": [ + "note", + "note" + ], "query": "[\"OR\", {\"pk\": [\"club\", \"note\", \"pk\"]}, {\"pk__in\": [\"NoteUser\", \"objects\", [\"filter\", {\"user__membership__club\": [\"club\"]}], [\"all\"]]}]", "type": "view", "mask": 2, @@ -311,7 +368,10 @@ "model": "permission.permission", "pk": 20, "fields": { - "model": 19, + "model": [ + "note", + "transaction" + ], "query": "[\"AND\", [\"OR\", {\"source\": [\"club\", \"note\"]}, {\"destination\": [\"club\", \"note\"]}], {\"amount__lte\": {\"F\": [\"ADD\", [\"F\", \"source__balance\"], 5000]}}]", "type": "add", "mask": 2, @@ -323,7 +383,10 @@ "model": "permission.permission", "pk": 21, "fields": { - "model": 25, + "model": [ + "note", + "recurrenttransaction" + ], "query": "[\"AND\", {\"destination\": [\"club\", \"note\"]}, {\"amount__lte\": {\"F\": [\"ADD\", [\"F\", \"source__balance\"], 5000]}}]", "type": "add", "mask": 2, @@ -335,7 +398,10 @@ "model": "permission.permission", "pk": 22, "fields": { - "model": 12, + "model": [ + "member", + "club" + ], "query": "{\"pk\": [\"club\", \"pk\"]}", "type": "view", "mask": 1, @@ -347,7 +413,10 @@ "model": "permission.permission", "pk": 23, "fields": { - "model": 19, + "model": [ + "note", + "transaction" + ], "query": "{}", "type": "change", "mask": 1, @@ -359,7 +428,10 @@ "model": "permission.permission", "pk": 24, "fields": { - "model": 19, + "model": [ + "note", + "transaction" + ], "query": "{}", "type": "view", "mask": 2, @@ -371,7 +443,10 @@ "model": "permission.permission", "pk": 25, "fields": { - "model": 23, + "model": [ + "note", + "notespecial" + ], "query": "{}", "type": "view", "mask": 2, @@ -383,7 +458,10 @@ "model": "permission.permission", "pk": 26, "fields": { - "model": 26, + "model": [ + "note", + "specialtransaction" + ], "query": "{}", "type": "add", "mask": 2, @@ -395,7 +473,10 @@ "model": "permission.permission", "pk": 27, "fields": { - "model": 18, + "model": [ + "note", + "templatecategory" + ], "query": "{}", "type": "view", "mask": 2, @@ -407,7 +488,10 @@ "model": "permission.permission", "pk": 28, "fields": { - "model": 18, + "model": [ + "note", + "templatecategory" + ], "query": "{}", "type": "change", "mask": 3, @@ -419,7 +503,10 @@ "model": "permission.permission", "pk": 29, "fields": { - "model": 18, + "model": [ + "note", + "templatecategory" + ], "query": "{}", "type": "add", "mask": 3, @@ -431,7 +518,10 @@ "model": "permission.permission", "pk": 30, "fields": { - "model": 20, + "model": [ + "note", + "transactiontemplate" + ], "query": "{}", "type": "view", "mask": 2, @@ -443,7 +533,10 @@ "model": "permission.permission", "pk": 31, "fields": { - "model": 20, + "model": [ + "note", + "transactiontemplate" + ], "query": "{}", "type": "add", "mask": 3, @@ -455,7 +548,10 @@ "model": "permission.permission", "pk": 32, "fields": { - "model": 20, + "model": [ + "note", + "transactiontemplate" + ], "query": "{}", "type": "change", "mask": 3, @@ -467,7 +563,10 @@ "model": "permission.permission", "pk": 33, "fields": { - "model": 19, + "model": [ + "note", + "transaction" + ], "query": "{}", "type": "add", "mask": 2, From f6027e9edd984ed96dcbb46e7bda38ccdc453b16 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 22 Mar 2020 14:57:51 +0100 Subject: [PATCH 18/84] Fix CI --- apps/permission/admin.py | 1 - apps/permission/api/views.py | 2 +- apps/permission/models.py | 2 -- apps/permission/signals.py | 3 +-- apps/permission/templatetags/perms.py | 4 +--- tox.ini | 2 +- 6 files changed, 4 insertions(+), 10 deletions(-) diff --git a/apps/permission/admin.py b/apps/permission/admin.py index aaa6f661..4312f4b0 100644 --- a/apps/permission/admin.py +++ b/apps/permission/admin.py @@ -28,4 +28,3 @@ class RolePermissionsAdmin(admin.ModelAdmin): Admin customisation for RolePermissions """ list_display = ('role', ) - diff --git a/apps/permission/api/views.py b/apps/permission/api/views.py index 6087c83e..965e82c9 100644 --- a/apps/permission/api/views.py +++ b/apps/permission/api/views.py @@ -2,8 +2,8 @@ # SPDX-License-Identifier: GPL-3.0-or-later from django_filters.rest_framework import DjangoFilterBackend - from api.viewsets import ReadOnlyProtectedModelViewSet + from .serializers import PermissionSerializer from ..models import Permission diff --git a/apps/permission/models.py b/apps/permission/models.py index 109c1875..205f5b41 100644 --- a/apps/permission/models.py +++ b/apps/permission/models.py @@ -10,7 +10,6 @@ from django.core.exceptions import ValidationError from django.db import models from django.db.models import F, Q, Model from django.utils.translation import gettext_lazy as _ - from member.models import Role @@ -281,4 +280,3 @@ class RolePermissions(models.Model): def __str__(self): return str(self.role) - diff --git a/apps/permission/signals.py b/apps/permission/signals.py index aebca39d..1e30f56f 100644 --- a/apps/permission/signals.py +++ b/apps/permission/signals.py @@ -3,10 +3,9 @@ from django.core.exceptions import PermissionDenied from django.db.models.signals import pre_save, pre_delete, post_save, post_delete - from logs import signals as logs_signals -from permission.backends import PermissionBackend from note_kfet.middlewares import get_current_authenticated_user +from permission.backends import PermissionBackend EXCLUDED = [ diff --git a/apps/permission/templatetags/perms.py b/apps/permission/templatetags/perms.py index 8f2a0006..8bcd3597 100644 --- a/apps/permission/templatetags/perms.py +++ b/apps/permission/templatetags/perms.py @@ -3,10 +3,8 @@ from django.contrib.contenttypes.models import ContentType from django.template.defaultfilters import stringfilter - -from note_kfet.middlewares import get_current_authenticated_user, get_current_session from django import template - +from note_kfet.middlewares import get_current_authenticated_user, get_current_session from permission.backends import PermissionBackend diff --git a/tox.ini b/tox.ini index bbfab4e7..01bf4edb 100644 --- a/tox.ini +++ b/tox.ini @@ -30,7 +30,7 @@ deps = pep8-naming pyflakes commands = - flake8 apps/activity apps/api apps/logs apps/member apps/note apps/treasury + flake8 apps/activity apps/api apps/logs apps/member apps/note apps/permission apps/treasury [flake8] # Ignore too many errors, should be reduced in the future From 15bfdd9f96d2c876f247f7460e7dac80d9c476ca Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 22 Mar 2020 15:24:54 +0100 Subject: [PATCH 19/84] Repair Invoice model --- apps/treasury/admin.py | 2 +- apps/treasury/forms.py | 10 +++++ apps/treasury/models.py | 54 +-------------------------- apps/treasury/tables.py | 2 +- apps/treasury/views.py | 32 +++++++++------- locale/de/LC_MESSAGES/django.po | 2 +- locale/fr/LC_MESSAGES/django.po | 2 +- templates/treasury/invoice_sample.tex | 2 +- 8 files changed, 35 insertions(+), 71 deletions(-) diff --git a/apps/treasury/admin.py b/apps/treasury/admin.py index 74b52150..cef9e37d 100644 --- a/apps/treasury/admin.py +++ b/apps/treasury/admin.py @@ -8,7 +8,7 @@ from .models import Invoice, Product @admin.register(Invoice) class InvoiceAdmin(admin.ModelAdmin): - list_display = ('id', 'name', 'subject', 'acquitted', ) + list_display = ('id', 'name', 'object', 'acquitted', ) @admin.register(Product) diff --git a/apps/treasury/forms.py b/apps/treasury/forms.py index d4b763ea..56fcce27 100644 --- a/apps/treasury/forms.py +++ b/apps/treasury/forms.py @@ -1,6 +1,8 @@ # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later +import datetime + from crispy_forms.helper import FormHelper from django import forms @@ -8,6 +10,14 @@ from .models import Invoice, Product class InvoiceForm(forms.ModelForm): + date = forms.DateField( + initial=datetime.date.today, + widget=forms.TextInput(attrs={'type': 'date'}) + ) + + def clean_date(self): + self.instance.date = self.data.get("date") + class Meta: model = Invoice fields = '__all__' diff --git a/apps/treasury/models.py b/apps/treasury/models.py index 3d1d0c48..52caeb0b 100644 --- a/apps/treasury/models.py +++ b/apps/treasury/models.py @@ -25,9 +25,9 @@ class Invoice(models.Model): verbose_name=_("BDE"), ) - subject = models.CharField( + object = models.CharField( max_length=255, - verbose_name=_("Subject"), + verbose_name=_("Object"), ) description = models.TextField( @@ -52,56 +52,6 @@ class Invoice(models.Model): verbose_name=_("Acquitted"), ) - place = models.CharField( - max_length=255, - default="Cachan", - verbose_name=_("Place"), - ) - - my_name = models.CharField( - max_length=255, - default="BDE ENS Cachan", - verbose_name=_("My name"), - ) - - my_address_street = models.CharField( - max_length=255, - default="61 avenue du Président Wilson", - verbose_name=_("My street address"), - ) - - my_city = models.CharField( - max_length=255, - default="94230 Cachan", - verbose_name=_("My city"), - ) - - bank_code = models.IntegerField( - default=30003, - verbose_name=_("Bank code"), - ) - - desk_code = models.IntegerField( - default=3894, - verbose_name=_("Desk code"), - ) - - account_number = models.IntegerField( - default=37280662, - verbose_name=_("Account number"), - ) - - rib_key = models.SmallIntegerField( - default=14, - verbose_name=_("RIB Key") - ) - - bic = models.CharField( - max_length=16, - default="SOGEFRPP", - verbose_name=_("BIC Code") - ) - class Product(models.Model): invoice = models.ForeignKey( diff --git a/apps/treasury/tables.py b/apps/treasury/tables.py index 156f6dcd..5dcfbcd6 100644 --- a/apps/treasury/tables.py +++ b/apps/treasury/tables.py @@ -29,4 +29,4 @@ class InvoiceTable(tables.Table): } model = Invoice template_name = 'django_tables2/bootstrap4.html' - fields = ('id', 'name', 'subject', 'acquitted', 'invoice',) + fields = ('id', 'name', 'object', 'acquitted', 'invoice',) diff --git a/apps/treasury/views.py b/apps/treasury/views.py index dcf4e913..8b5446d6 100644 --- a/apps/treasury/views.py +++ b/apps/treasury/views.py @@ -47,9 +47,9 @@ class InvoiceCreateView(LoginRequiredMixin, CreateView): kwargs = {} for key in self.request.POST: value = self.request.POST[key] - if key.endswith("amount"): + if key.endswith("amount") and value: kwargs[key] = str(int(100 * float(value))) - else: + elif value: kwargs[key] = value formset = ProductFormSet(kwargs, instance=form.instance) @@ -87,6 +87,7 @@ class InvoiceUpdateView(LoginRequiredMixin, UpdateView): form = context['form'] form.helper = FormHelper() form.helper.form_tag = False + form.fields['date'].initial = form.instance.date form_set = ProductFormSet(instance=form.instance) context['formset'] = form_set context['helper'] = ProductFormSetHelper() @@ -100,26 +101,22 @@ class InvoiceUpdateView(LoginRequiredMixin, UpdateView): kwargs = {} for key in self.request.POST: value = self.request.POST[key] - if key.endswith("amount"): + if key.endswith("amount") and value: kwargs[key] = str(int(100 * float(value))) - else: + elif value: kwargs[key] = value formset = ProductFormSet(kwargs, instance=form.instance) saved = [] - print(formset.errors) if formset.is_valid(): for f in formset: if f.is_valid() and f.instance.designation: - if type(f.instance.pk) == 'number' and f.instance.pk <= 0: - f.instance.pk = None f.save() f.instance.save() saved.append(f.instance.pk) else: f.instance = None - - Product.objects.filter(~Q(pk__in=saved), invoice=form.instance).delete() + Product.objects.filter(~Q(pk__in=saved), invoice=form.instance).delete() return ret @@ -137,8 +134,18 @@ class InvoiceRenderView(LoginRequiredMixin, View): invoice = Invoice.objects.get(pk=pk) products = Product.objects.filter(invoice=invoice).all() - invoice.description = invoice.description.replace("\n", "\\newline\n") - invoice.address = invoice.address.replace("\n", "\\newline\n") + invoice.place = "Cachan" + invoice.my_name = "BDE ENS Cachan" + invoice.my_address_street = "61 avenue du Président Wilson" + invoice.my_city = "94230 Cachan" + invoice.bank_code = 30003 + invoice.desk_code = 3894 + invoice.account_number = 37280662 + invoice.rib_key = 14 + invoice.bic = "SOGEFRPP" + + invoice.description = invoice.description.replace("\r", "").replace("\n", "\\\\ ") + invoice.address = invoice.address.replace("\r", "").replace("\n", "\\\\ ") tex = render_to_string("treasury/invoice_sample.tex", dict(obj=invoice, products=products)) try: os.mkdir(BASE_DIR + "/tmp") @@ -155,9 +162,6 @@ class InvoiceRenderView(LoginRequiredMixin, View): error = subprocess.Popen( ["pdflatex", "invoice-{}.tex".format(pk)], cwd=tmp_dir, - stdin=open(os.devnull, "r"), - stderr=open(os.devnull, "wb"), - stdout=open(os.devnull, "wb") ).wait() if error: diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 29ec1bdc..4e950765 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -505,7 +505,7 @@ msgid "BDE" msgstr "" #: apps/treasury/models.py:30 -msgid "Subject" +msgid "Object" msgstr "" #: apps/treasury/models.py:34 diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index b137cc0e..8770d433 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -505,7 +505,7 @@ msgid "BDE" msgstr "BDE" #: apps/treasury/models.py:30 -msgid "Subject" +msgid "Object" msgstr "Objet" #: apps/treasury/models.py:34 diff --git a/templates/treasury/invoice_sample.tex b/templates/treasury/invoice_sample.tex index 625d10ba..3c76403e 100644 --- a/templates/treasury/invoice_sample.tex +++ b/templates/treasury/invoice_sample.tex @@ -85,7 +85,7 @@ \def\FactureAcquittee {% if obj.acquitted %} {oui} {% else %} {non} {% endif %} % Facture acquittée : oui/non \def\FactureLieu {{"{"}}{{ obj.place }}} % Lieu de l'édition de la facture \def\FactureDate {{"{"}}{{ obj.date }}} % Date de l'édition de la facture -\def\FactureObjet {{"{"}}{{ obj.subject|safe }} } % Objet du document +\def\FactureObjet {{"{"}}{{ obj.object|safe }} } % Objet du document % Description de la facture \def\FactureDescr {{"{"}}{{ obj.description|safe }}} From d641b4cc1cd03aa57979ea94715f8209cfaeaf44 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 22 Mar 2020 15:33:48 +0100 Subject: [PATCH 20/84] Can't change which BDE has editted the invoice --- apps/treasury/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/treasury/forms.py b/apps/treasury/forms.py index 56fcce27..ad7e2c5c 100644 --- a/apps/treasury/forms.py +++ b/apps/treasury/forms.py @@ -20,7 +20,7 @@ class InvoiceForm(forms.ModelForm): class Meta: model = Invoice - fields = '__all__' + exclude = ('bde', ) ProductFormSet = forms.inlineformset_factory( From 5ac10b58d5692b2aed1ac158f29c57cdb9b3351c Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 22 Mar 2020 16:04:09 +0100 Subject: [PATCH 21/84] API Support (useless, but...) --- apps/api/urls.py | 2 ++ apps/treasury/api/serializers.py | 34 ++++++++++++++++++++++++++++++++ apps/treasury/api/urls.py | 12 +++++++++++ apps/treasury/api/views.py | 33 +++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 apps/treasury/api/serializers.py create mode 100644 apps/treasury/api/urls.py create mode 100644 apps/treasury/api/views.py diff --git a/apps/api/urls.py b/apps/api/urls.py index b275a0b8..67fdba30 100644 --- a/apps/api/urls.py +++ b/apps/api/urls.py @@ -12,6 +12,7 @@ from activity.api.urls import register_activity_urls from api.viewsets import ReadProtectedModelViewSet from member.api.urls import register_members_urls from note.api.urls import register_note_urls +from treasury.api.urls import register_treasury_urls from logs.api.urls import register_logs_urls from permission.api.urls import register_permission_urls @@ -74,6 +75,7 @@ router.register('user', UserViewSet) register_members_urls(router, 'members') register_activity_urls(router, 'activity') register_note_urls(router, 'note') +register_treasury_urls(router, 'treasury') register_permission_urls(router, 'permission') register_logs_urls(router, 'logs') diff --git a/apps/treasury/api/serializers.py b/apps/treasury/api/serializers.py new file mode 100644 index 00000000..c835fd80 --- /dev/null +++ b/apps/treasury/api/serializers.py @@ -0,0 +1,34 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from rest_framework import serializers + +from ..models import Invoice, Product + + +class ProductSerializer(serializers.ModelSerializer): + """ + REST API Serializer for Product types. + The djangorestframework plugin will analyse the model `Product` and parse all fields in the API. + """ + + class Meta: + model = Product + fields = '__all__' + + +class InvoiceSerializer(serializers.ModelSerializer): + """ + REST API Serializer for Invoice types. + The djangorestframework plugin will analyse the model `Invoice` and parse all fields in the API. + """ + class Meta: + model = Invoice + fields = '__all__' + read_only_fields = ('bde',) + + products = serializers.SerializerMethodField() + + def get_products(self, obj): + return serializers.ListSerializer(child=ProductSerializer())\ + .to_representation(Product.objects.filter(invoice=obj).all()) diff --git a/apps/treasury/api/urls.py b/apps/treasury/api/urls.py new file mode 100644 index 00000000..ff3a606f --- /dev/null +++ b/apps/treasury/api/urls.py @@ -0,0 +1,12 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from .views import InvoiceViewSet, ProductViewSet + + +def register_treasury_urls(router, path): + """ + Configure router for treasury REST API. + """ + router.register(path + '/invoice', InvoiceViewSet) + router.register(path + '/product', ProductViewSet) diff --git a/apps/treasury/api/views.py b/apps/treasury/api/views.py new file mode 100644 index 00000000..2f35b92c --- /dev/null +++ b/apps/treasury/api/views.py @@ -0,0 +1,33 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.filters import SearchFilter +from api.viewsets import ReadProtectedModelViewSet + +from .serializers import InvoiceSerializer, ProductSerializer +from ..models import Invoice, Product + + +class InvoiceViewSet(ReadProtectedModelViewSet): + """ + REST API View set. + The djangorestframework plugin will get all `Invoice` objects, serialize it to JSON with the given serializer, + then render it on /api/treasury/invoice/ + """ + queryset = Invoice.objects.all() + serializer_class = InvoiceSerializer + filter_backends = [DjangoFilterBackend] + filterset_fields = ['bde', ] + + +class ProductViewSet(ReadProtectedModelViewSet): + """ + REST API View set. + The djangorestframework plugin will get all `Product` objects, serialize it to JSON with the given serializer, + then render it on /api/treasury/product/ + """ + queryset = Product.objects.all() + serializer_class = ProductSerializer + filter_backends = [SearchFilter] + search_fields = ['$designation', ] From 3551568de5fe362f86236f1ca3a23992ff950f31 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 22 Mar 2020 17:29:31 +0100 Subject: [PATCH 22/84] Add remittance model --- apps/note/models/transactions.py | 8 +++++++ apps/treasury/models.py | 38 +++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py index 0e40edf6..6dbf3504 100644 --- a/apps/note/models/transactions.py +++ b/apps/note/models/transactions.py @@ -6,6 +6,7 @@ from django.urls import reverse from django.utils import timezone from django.utils.translation import gettext_lazy as _ from polymorphic.models import PolymorphicModel +from treasury.models import Remittance from .notes import Note, NoteClub, NoteSpecial @@ -209,6 +210,13 @@ class SpecialTransaction(Transaction): blank=True, ) + remittance = models.ForeignKey( + Remittance, + on_delete=models.PROTECT, + null=True, + verbose_name=_("Remittance"), + ) + @property def type(self): return _('Credit') if isinstance(self.source, NoteSpecial) else _("Debit") diff --git a/apps/treasury/models.py b/apps/treasury/models.py index 52caeb0b..7c634fdd 100644 --- a/apps/treasury/models.py +++ b/apps/treasury/models.py @@ -1,8 +1,10 @@ # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later - +from django.core.exceptions import ValidationError from django.db import models +from django.db.models import Q from django.utils.translation import gettext_lazy as _ +from note.models import NoteSpecial class Invoice(models.Model): @@ -83,3 +85,37 @@ class Product(models.Model): @property def total_euros(self): return self.total / 100 + + +class Remittance(models.Model): + date = models.DateField( + auto_now_add=True, + verbose_name=_("Date"), + ) + + type = models.ForeignKey( + NoteSpecial, + on_delete=models.PROTECT, + verbose_name=_("Type"), + ) + + comment = models.CharField( + max_length=255, + verbose_name=_("Comment"), + ) + + @property + def size(self): + return self.specialtransaction_set.count() + + @property + def amount(self): + return sum(transaction.total for transaction in self.specialtransaction_set.all()) + + def full_clean(self, exclude=None, validate_unique=True): + ret = super().full_clean(exclude, validate_unique) + + if self.specialtransaction_set.filter(~Q(source=self.type)).exists(): + raise ValidationError("All transactions in a remittance must have the same type") + + return ret From 5fd472d408ae13e89412134b5059735fd8302157 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 22 Mar 2020 18:27:22 +0100 Subject: [PATCH 23/84] Create, view and update remittances --- apps/treasury/forms.py | 15 +++++++++- apps/treasury/models.py | 8 ++++- apps/treasury/tables.py | 12 +++++++- apps/treasury/urls.py | 9 ++++-- apps/treasury/views.py | 40 +++++++++++++++++++++---- templates/base.html | 2 +- templates/treasury/invoice_form.html | 2 +- templates/treasury/remittance_form.html | 8 +++++ templates/treasury/remittance_list.html | 10 +++++++ 9 files changed, 94 insertions(+), 12 deletions(-) create mode 100644 templates/treasury/remittance_form.html create mode 100644 templates/treasury/remittance_list.html diff --git a/apps/treasury/forms.py b/apps/treasury/forms.py index ad7e2c5c..3189694d 100644 --- a/apps/treasury/forms.py +++ b/apps/treasury/forms.py @@ -4,9 +4,11 @@ import datetime from crispy_forms.helper import FormHelper +from crispy_forms.layout import Submit from django import forms +from django.utils.translation import gettext_lazy as _ -from .models import Invoice, Product +from .models import Invoice, Product, Remittance class InvoiceForm(forms.ModelForm): @@ -38,3 +40,14 @@ class ProductFormSetHelper(FormHelper): self.form_method = 'POST' self.form_class = 'form-inline' self.template = 'bootstrap4/table_inline_formset.html' + + +class RemittanceForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.helper = FormHelper() + self.helper.add_input(Submit('submit', _("Submit"), attr={'class': 'btn btn-block btn-primary'})) + + class Meta: + model = Remittance + fields = ('type', 'comment', ) diff --git a/apps/treasury/models.py b/apps/treasury/models.py index 7c634fdd..52b25157 100644 --- a/apps/treasury/models.py +++ b/apps/treasury/models.py @@ -1,5 +1,6 @@ # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later + from django.core.exceptions import ValidationError from django.db import models from django.db.models import Q @@ -88,7 +89,7 @@ class Product(models.Model): class Remittance(models.Model): - date = models.DateField( + date = models.DateTimeField( auto_now_add=True, verbose_name=_("Date"), ) @@ -104,6 +105,11 @@ class Remittance(models.Model): verbose_name=_("Comment"), ) + closed = models.BooleanField( + default=False, + verbose_name=_("Closed"), + ) + @property def size(self): return self.specialtransaction_set.count() diff --git a/apps/treasury/tables.py b/apps/treasury/tables.py index 5dcfbcd6..ebc642c7 100644 --- a/apps/treasury/tables.py +++ b/apps/treasury/tables.py @@ -5,7 +5,7 @@ import django_tables2 as tables from django.utils.translation import gettext_lazy as _ from django_tables2 import A -from .models import Invoice +from .models import Invoice, Remittance class InvoiceTable(tables.Table): @@ -30,3 +30,13 @@ class InvoiceTable(tables.Table): model = Invoice template_name = 'django_tables2/bootstrap4.html' fields = ('id', 'name', 'object', 'acquitted', 'invoice',) + + +class RemittanceTable(tables.Table): + class Meta: + attrs = { + 'class': 'table table-condensed table-striped table-hover' + } + model = Remittance + template_name = 'django_tables2/bootstrap4.html' + fields = ('id', 'date', 'type', 'comment', 'size', 'amount', 'edit',) diff --git a/apps/treasury/urls.py b/apps/treasury/urls.py index 1afccabb..029466e0 100644 --- a/apps/treasury/urls.py +++ b/apps/treasury/urls.py @@ -3,12 +3,17 @@ from django.urls import path -from .views import InvoiceCreateView, InvoiceListView, InvoiceUpdateView, InvoiceRenderView +from .views import InvoiceCreateView, InvoiceListView, InvoiceUpdateView, InvoiceRenderView, RemittanceListView,\ + RemittanceCreateView, RemittanceUpdateView app_name = 'treasury' urlpatterns = [ - path('invoice/', InvoiceListView.as_view(), name='invoice'), + path('invoice/', InvoiceListView.as_view(), name='invoice_list'), path('invoice/create/', InvoiceCreateView.as_view(), name='invoice_create'), path('invoice//', InvoiceUpdateView.as_view(), name='invoice_update'), path('invoice/render//', InvoiceRenderView.as_view(), name='invoice_render'), + + path('remittance/', RemittanceListView.as_view(), name='remittance_list'), + path('remittance/create/', RemittanceCreateView.as_view(), name='remittance_create'), + path('remittance//', RemittanceUpdateView.as_view(), name='remittance_update'), ] diff --git a/apps/treasury/views.py b/apps/treasury/views.py index 8b5446d6..6f6c256c 100644 --- a/apps/treasury/views.py +++ b/apps/treasury/views.py @@ -17,9 +17,9 @@ from django.views.generic.base import View from django_tables2 import SingleTableView from note_kfet.settings.base import BASE_DIR -from .forms import InvoiceForm, ProductFormSet, ProductFormSetHelper -from .models import Invoice, Product -from .tables import InvoiceTable +from .forms import InvoiceForm, ProductFormSet, ProductFormSetHelper, RemittanceForm +from .models import Invoice, Product, Remittance +from .tables import InvoiceTable, RemittanceTable class InvoiceCreateView(LoginRequiredMixin, CreateView): @@ -64,7 +64,7 @@ class InvoiceCreateView(LoginRequiredMixin, CreateView): return ret def get_success_url(self): - return reverse_lazy('treasury:invoice') + return reverse_lazy('treasury:invoice_list') class InvoiceListView(LoginRequiredMixin, SingleTableView): @@ -121,7 +121,7 @@ class InvoiceUpdateView(LoginRequiredMixin, UpdateView): return ret def get_success_url(self): - return reverse_lazy('treasury:invoice') + return reverse_lazy('treasury:invoice_list') class InvoiceRenderView(LoginRequiredMixin, View): @@ -176,3 +176,33 @@ class InvoiceRenderView(LoginRequiredMixin, View): shutil.rmtree(tmp_dir) return response + + +class RemittanceCreateView(LoginRequiredMixin, CreateView): + """ + Create Remittance + """ + model = Remittance + form_class = RemittanceForm + + def get_success_url(self): + return reverse_lazy('treasury:remittance_list') + + +class RemittanceListView(LoginRequiredMixin, SingleTableView): + """ + List existing Remittances + """ + model = Remittance + table_class = RemittanceTable + + +class RemittanceUpdateView(LoginRequiredMixin, UpdateView): + """ + Update Remittance + """ + model = Remittance + form_class = RemittanceForm + + def get_success_url(self): + return reverse_lazy('treasury:remittance_list') diff --git a/templates/base.html b/templates/base.html index c6bb88b3..384535b2 100644 --- a/templates/base.html +++ b/templates/base.html @@ -99,7 +99,7 @@ SPDX-License-Identifier: GPL-3.0-or-later {% if "treasury.invoice"|not_empty_model_change_list %} {% endif %} diff --git a/templates/treasury/invoice_form.html b/templates/treasury/invoice_form.html index 2177d0f7..f6e2a106 100644 --- a/templates/treasury/invoice_form.html +++ b/templates/treasury/invoice_form.html @@ -3,7 +3,7 @@ {% load i18n %} {% load crispy_forms_tags pretty_money %} {% block content %} -

{% trans "Invoices list" %}

+

{% trans "Invoices list" %}

{% csrf_token %} {% crispy form %} diff --git a/templates/treasury/remittance_form.html b/templates/treasury/remittance_form.html new file mode 100644 index 00000000..50071136 --- /dev/null +++ b/templates/treasury/remittance_form.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} +{% load static %} +{% load i18n %} +{% load crispy_forms_tags pretty_money %} +{% block content %} +

{% trans "Remittances list" %}

+ {% crispy form %} +{% endblock %} diff --git a/templates/treasury/remittance_list.html b/templates/treasury/remittance_list.html new file mode 100644 index 00000000..e775fbaa --- /dev/null +++ b/templates/treasury/remittance_list.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} +{% load render_table from django_tables2 %} +{% load i18n %} +{% block content %} + +{% render_table table %} + +{% trans "New remittance" %} + +{% endblock %} From a4cb19e5b187116bee5364d3b049ab44a82a1cf7 Mon Sep 17 00:00:00 2001 From: Benjamin Graillot Date: Mon, 23 Mar 2020 09:07:39 +0100 Subject: [PATCH 24/84] [member] Added parent_club field to Club --- apps/member/models.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/member/models.py b/apps/member/models.py index cdbb9332..41f5bdf3 100644 --- a/apps/member/models.py +++ b/apps/member/models.py @@ -67,6 +67,13 @@ class Club(models.Model): email = models.EmailField( verbose_name=_('email'), ) + parent_club = models.ForeignKey( + 'self', + null=True, + blank=True, + on_delete=models.PROTECT, + verbose_name=_('parent club'), + ) # Memberships membership_fee = models.PositiveIntegerField( From 3cdb3f6d3820867c2490a45a9ff379015d4abf32 Mon Sep 17 00:00:00 2001 From: Pierre-antoine Comby Date: Mon, 23 Mar 2020 15:28:09 +0100 Subject: [PATCH 25/84] Refactor and comment noteView --- apps/note/urls.py | 2 +- apps/note/views.py | 27 ++++++++++++++++++--------- apps/scripts | 1 + 3 files changed, 20 insertions(+), 10 deletions(-) create mode 160000 apps/scripts diff --git a/apps/note/urls.py b/apps/note/urls.py index fea911f6..59316069 100644 --- a/apps/note/urls.py +++ b/apps/note/urls.py @@ -8,7 +8,7 @@ from .models import Note app_name = 'note' urlpatterns = [ - path('transfer/', views.TransactionCreate.as_view(), name='transfer'), + path('transfer/', views.TransactionCreateView.as_view(), name='transfer'), path('buttons/create/', views.TransactionTemplateCreateView.as_view(), name='template_create'), path('buttons/update//', views.TransactionTemplateUpdateView.as_view(), name='template_update'), path('buttons/', views.TransactionTemplateListView.as_view(), name='template_list'), diff --git a/apps/note/views.py b/apps/note/views.py index e0105140..63d951cb 100644 --- a/apps/note/views.py +++ b/apps/note/views.py @@ -14,12 +14,13 @@ from .forms import TransactionForm, TransactionTemplateForm, ConsoForm from .models import Transaction, TransactionTemplate, Alias, TemplateTransaction from .tables import ButtonTable -class TransactionCreate(LoginRequiredMixin, CreateView): +class TransactionCreateView(LoginRequiredMixin, SingleTableView): """ - Show transfer page + View for the creation of Transaction between two note which are not :models:`transactions.RecurrentTransaction`. + e.g. for donation/transfer between people and clubs or for credit/debit with :models:`note.NoteSpecial` + """ + template_name = "note/transaction_form.html" - TODO: If user have sufficient rights, they can transfer from an other note - """ model = Transaction form_class = TransactionForm @@ -53,13 +54,14 @@ class TransactionCreate(LoginRequiredMixin, CreateView): class NoteAutocomplete(autocomplete.Select2QuerySetView): """ - Auto complete note by aliases + Auto complete note by aliases. Used in every search field for note + ex: :view:`ConsoView`, :view:`TransactionCreateView` """ def get_queryset(self): """ - Quand une personne cherche un alias, une requête est envoyée sur l'API dédiée à l'auto-complétion. - Cette fonction récupère la requête, et renvoie la liste filtrée des aliases. + When someone look for an :models:`note.Alias`, a query is sent to the dedicated API. + This function handles the result and return a filtered list of aliases. """ # Un utilisateur non connecté n'a accès à aucune information if not self.request.user.is_authenticated: @@ -88,6 +90,10 @@ class NoteAutocomplete(autocomplete.Select2QuerySetView): return qs def get_result_label(self, result): + """ + Show the selected alias and the username associated + (aka. ) + """ # Gère l'affichage de l'alias dans la recherche res = result.name note_name = str(result.note) @@ -96,7 +102,9 @@ class NoteAutocomplete(autocomplete.Select2QuerySetView): return res def get_result_value(self, result): - # Le résultat renvoyé doit être l'identifiant de la note, et non de l'alias + """ + The value used for the transactions will be the id of the Note. + """ return str(result.note.pk) @@ -125,7 +133,8 @@ class TransactionTemplateUpdateView(LoginRequiredMixin, UpdateView): class ConsoView(LoginRequiredMixin, CreateView): """ - Consume + The Magic View that make people pay their beer and burgers. + (Most of the magic happens in the dark world of Javascript see consos.js) """ model = TemplateTransaction template_name = "note/conso_form.html" diff --git a/apps/scripts b/apps/scripts new file mode 160000 index 00000000..b9fdced3 --- /dev/null +++ b/apps/scripts @@ -0,0 +1 @@ +Subproject commit b9fdced3c2ce34168b8f0d6004a20a69ca16e0de From 41a0529d0c168c2d37f3bfb8c2fc0673b472c05a Mon Sep 17 00:00:00 2001 From: Pierre-antoine Comby Date: Mon, 23 Mar 2020 15:35:24 +0100 Subject: [PATCH 26/84] fixin the merge... --- apps/note/tables.py | 2 +- apps/note/views.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/note/tables.py b/apps/note/tables.py index 050c8981..f50379c4 100644 --- a/apps/note/tables.py +++ b/apps/note/tables.py @@ -9,7 +9,7 @@ from django_tables2.utils import A from django.utils.translation import gettext_lazy as _ from .models.notes import Alias -from .models.transactions import Transaction +from .models.transactions import Transaction, TransactionTemplate from .templatetags.pretty_money import pretty_money diff --git a/apps/note/views.py b/apps/note/views.py index 4f13f749..d656d7fc 100644 --- a/apps/note/views.py +++ b/apps/note/views.py @@ -13,7 +13,7 @@ from permission.backends import PermissionBackend from .forms import TransactionTemplateForm from .models import Transaction, TransactionTemplate, Alias, RecurrentTransaction, NoteSpecial from .models.transactions import SpecialTransaction -from .tables import HistoryTable +from .tables import HistoryTable, ButtonTable class TransactionCreateView(LoginRequiredMixin, SingleTableView): @@ -24,7 +24,6 @@ class TransactionCreateView(LoginRequiredMixin, SingleTableView): template_name = "note/transaction_form.html" model = Transaction - form_class = TransactionForm # Transaction history table table_class = HistoryTable table_pagination = {"per_page": 50} From 1ce7dc011814ce7df0fc8d14a30e14aa7ff37323 Mon Sep 17 00:00:00 2001 From: Pierre-antoine Comby Date: Mon, 23 Mar 2020 15:53:10 +0100 Subject: [PATCH 27/84] reorganize tabs of nav bar --- templates/base.html | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/templates/base.html b/templates/base.html index fae86443..2f07a6cc 100644 --- a/templates/base.html +++ b/templates/base.html @@ -79,6 +79,9 @@ SPDX-License-Identifier: GPL-3.0-or-later {% trans 'Consumptions' %} {% endif %} + {% if "member.club"|not_empty_model_list %} {% endif %} - {% if "note.transactiontemplate"|not_empty_model_change_list %} - - {% endif %} -