diff --git a/apps/member/models.py b/apps/member/models.py index 883f9b4956ab78b31a3d8cb4b628efe465b9d8b6..35b7027c5704e6ff5474370996dd4e3c23dccd93 100644 --- a/apps/member/models.py +++ b/apps/member/models.py @@ -118,6 +118,9 @@ class Role(models.Model): verbose_name = _('role') verbose_name_plural = _('roles') + def __str__(self): + return str(self.name) + class Membership(models.Model): """ diff --git a/apps/note/admin.py b/apps/note/admin.py index 298b91c052294d5a3a1b7a64d4fc6637adefb631..0b2461d02e0818eb63ecaa6a109d281952b451e1 100644 --- a/apps/note/admin.py +++ b/apps/note/admin.py @@ -8,7 +8,7 @@ from polymorphic.admin import PolymorphicChildModelAdmin, \ PolymorphicChildModelFilter, PolymorphicParentModelAdmin from .models.notes import Alias, Note, NoteClub, NoteSpecial, NoteUser -from .models.transactions import Transaction, TransactionTemplate +from .models.transactions import Transaction, TransactionCategory, TransactionTemplate class AliasInlines(admin.TabularInline): @@ -146,3 +146,12 @@ class TransactionTemplateAdmin(admin.ModelAdmin): return str(obj.destination) poly_destination.short_description = _('destination') + + +@admin.register(TransactionCategory) +class TransactionCategoryAdmin(admin.ModelAdmin): + """ + Admin customisation for TransactionTemplate + """ + list_display = ('name',) + list_filter = ('name',) diff --git a/apps/note/forms.py b/apps/note/forms.py index d74fa5b4db8572da1e29fdad542f4796b8b3acce..d861345b4e83bc50f15496563eeafba539ddfa96 100644 --- a/apps/note/forms.py +++ b/apps/note/forms.py @@ -1,9 +1,22 @@ #!/usr/bin/env python from django import forms -from .models import TransactionTemplate +from .models import TransactionTemplate, Transaction class TransactionTemplateForm(forms.ModelForm): class Meta: model = TransactionTemplate fields ='__all__' + +class ConsoForm(forms.ModelForm): + def save(self, commit=True): + button: TransactionTemplate = TransactionTemplate.objects.filter(name=self.data['button']).get() + self.instance.destination = button.destination + self.instance.amount = button.amount + self.instance.transaction_type = 'bouton' + self.instance.reason = button.name + super().save(commit) + + class Meta: + model = Transaction + fields = ('source',) diff --git a/apps/note/models/__init__.py b/apps/note/models/__init__.py index b00572ce4a83a36d03791895e0a9ca33fc2b6644..ee290bb59bb5d675a3f53bc1803c2fb849cb030e 100644 --- a/apps/note/models/__init__.py +++ b/apps/note/models/__init__.py @@ -4,11 +4,11 @@ from .notes import Alias, Note, NoteClub, NoteSpecial, NoteUser from .transactions import MembershipTransaction, Transaction, \ - TransactionTemplate + TransactionCategory, TransactionTemplate __all__ = [ # Notes 'Alias', 'Note', 'NoteClub', 'NoteSpecial', 'NoteUser', # Transactions - 'MembershipTransaction', 'Transaction', 'TransactionTemplate', + 'MembershipTransaction', 'Transaction', 'TransactionCategory', 'TransactionTemplate', ] diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py index 4ce23311cd31d62a27a20fee70720bf71074576d..5c2422553dd9be4d66c320ae56d5237828da7ee2 100644 --- a/apps/note/models/transactions.py +++ b/apps/note/models/transactions.py @@ -13,10 +13,28 @@ from .notes import Note,NoteClub Defines transactions """ +class TransactionCategory(models.Model): + """ + Defined a recurrent transaction category + + Example: food, softs, ... + """ + name = models.CharField( + verbose_name=_("name"), + max_length=31, + unique=True, + ) + + class Meta: + verbose_name = _("transaction category") + verbose_name_plural = _("transaction categories") + + def __str__(self): + return str(self.name) class TransactionTemplate(models.Model): """ - Defined a reccurent transaction + Defined a recurrent transaction associated to selling something (a burger, a beer, ...) """ @@ -35,7 +53,9 @@ class TransactionTemplate(models.Model): verbose_name=_('amount'), help_text=_('in centimes'), ) - template_type = models.CharField( + template_type = models.ForeignKey( + TransactionCategory, + on_delete=models.PROTECT, verbose_name=_('type'), max_length=31 ) diff --git a/apps/note/urls.py b/apps/note/urls.py index 5e423d465b6339124063fe1f59e28e93f96d2f4a..59bb4672d48a17bf17148acf0b22611803a37198 100644 --- a/apps/note/urls.py +++ b/apps/note/urls.py @@ -11,5 +11,7 @@ urlpatterns = [ path('transfer/', views.TransactionCreate.as_view(), name='transfer'), path('buttons/create/',views.TransactionTemplateCreateView.as_view(),name='template_create'), path('buttons/update/<int:pk>/',views.TransactionTemplateUpdateView.as_view(),name='template_update'), - path('buttons/',views.TransactionTemplateListView.as_view(),name='template_list') + path('buttons/',views.TransactionTemplateListView.as_view(),name='template_list'), + path('consos/<str:template_type>/',views.ConsoView.as_view(),name='consos'), + path('consos/',views.ConsoView.as_view(),name='consos'), ] diff --git a/apps/note/views.py b/apps/note/views.py index 08f4f63093a89226a6d3548b9ee7e9399449dacc..ce27832c3492fdae360a7117c26757bf8f342aba 100644 --- a/apps/note/views.py +++ b/apps/note/views.py @@ -3,11 +3,12 @@ # SPDX-License-Identifier: GPL-3.0-or-later from django.contrib.auth.mixins import LoginRequiredMixin +from django.urls import reverse_lazy, reverse from django.utils.translation import gettext_lazy as _ from django.views.generic import CreateView, ListView, DetailView, UpdateView -from .models import Transaction,TransactionTemplate -from .forms import TransactionTemplateForm +from .models import Transaction,TransactionCategory,TransactionTemplate +from .forms import TransactionTemplateForm, ConsoForm class TransactionCreate(LoginRequiredMixin, CreateView): """ @@ -45,4 +46,31 @@ class TransactionTemplateUpdateView(LoginRequiredMixin,UpdateView): """ """ model = TransactionTemplate - form_class=TransactionTemplateForm + form_class = TransactionTemplateForm + +class ConsoView(LoginRequiredMixin,CreateView): + """ + Consume + """ + model = Transaction + template_name = "note/conso_form.html" + form_class = ConsoForm + + def get_context_data(self, **kwargs): + """ + Add some context variables in template such as page title + """ + context = super().get_context_data(**kwargs) + context['template_types'] = TransactionCategory.objects.all() + + if 'template_type' not in self.kwargs.keys(): + return context + + template_type = TransactionCategory.objects.filter(name=self.kwargs.get('template_type')).get() + context['buttons'] = TransactionTemplate.objects.filter(template_type=template_type) + context['title'] = template_type + + return context + + def get_success_url(self): + return reverse('note:consos',args=(self.kwargs.get('template_type'),)) diff --git a/templates/base.html b/templates/base.html index 5c85759319fc558902ee0b6364afbdf51337e959..96f56881bc660192eec6a81eb4da93f4b3812efd 100644 --- a/templates/base.html +++ b/templates/base.html @@ -46,7 +46,7 @@ SPDX-License-Identifier: GPL-3.0-or-later <div class="collapse navbar-collapse" id="navbarNavDropdown"> <ul class="navbar-nav"> <li class="nav-item active"> - <a class="nav-link" href="#"><i class="fa fa-coffee"></i> Consos</a> + <a class="nav-link" href="{% url 'note:consos' %}"><i class="fa fa-coffee"></i> Consos</a> </li> <li class="nav-item active"> <a class="nav-link" href="{% url 'member:club_list' %}"><i class="fa fa-users"></i> Clubs</a> diff --git a/templates/note/conso_form.html b/templates/note/conso_form.html new file mode 100644 index 0000000000000000000000000000000000000000..e2106f1794c41d65c42c438df6fa4771c73057b2 --- /dev/null +++ b/templates/note/conso_form.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} + +{% load i18n static pretty_money %} + +{% block content %} + <fieldset class="module aligned"> + {% for type in template_types %} + <a href="{% url 'note:consos' template_type=type %}"><button>{{ type }}</button></a> + {% endfor %} + </fieldset> + <form method="post" onsubmit="window.onbeforeunload=null">{% csrf_token %} + {% if form.non_field_errors %} + <p class="errornote"> + {% for error in form.non_field_errors %} + {{ error }} + {% endfor %} + </p> + {% endif %} + <fieldset class="module aligned"> + {% for field in form %} + <div class="form-row{% if field.errors %} errors{% endif %}"> + {{ field.errors }} + <div> + {{ field.label_tag }} + {% if field.is_readonly %} + <div class="readonly">{{ field.contents }}</div> + {% else %} + {{ field }} + {% endif %} + {% if field.field.help_text %} + <div class="help">{{ field.field.help_text|safe }}</div> + {% endif %} + </div> + </div> + {% endfor %} + {% for button in buttons %} + <button name="button" value="{{ button.name }}">{{ button.name }} ({{ button.amount | pretty_money }})</button> + {% endfor %} + </fieldset> + </form> +{% endblock %}