nk20/apps/note/views.py

153 lines
4.7 KiB
Python
Raw Normal View History

2020-02-18 20:30:26 +00:00
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
2019-07-17 11:34:07 +00:00
# SPDX-License-Identifier: GPL-3.0-or-later
2020-02-08 19:23:17 +00:00
from dal import autocomplete
2019-07-17 11:53:58 +00:00
from django.contrib.auth.mixins import LoginRequiredMixin
2020-02-08 19:23:17 +00:00
from django.db.models import Q
2020-02-18 20:14:29 +00:00
from django.urls import reverse
2019-07-17 11:34:07 +00:00
from django.utils.translation import gettext_lazy as _
2020-02-18 20:14:29 +00:00
from django.views.generic import CreateView, ListView, UpdateView
2019-07-17 11:34:07 +00:00
from django_tables2 import SingleTableView
from .forms import TransactionForm, TransactionTemplateForm, ConsoForm
2020-03-07 21:28:59 +00:00
from .models import Transaction, TransactionTemplate, Alias, TemplateTransaction
from .tables import ButtonTable
2020-02-18 11:31:15 +00:00
2019-07-17 11:53:58 +00:00
class TransactionCreate(LoginRequiredMixin, CreateView):
2019-07-17 11:34:07 +00:00
"""
Show transfer page
TODO: If user have sufficient rights, they can transfer from an other note
"""
2019-07-17 11:53:58 +00:00
model = Transaction
2020-02-08 19:23:17 +00:00
form_class = TransactionForm
2019-07-17 11:53:58 +00:00
def get_context_data(self, **kwargs):
"""
Add some context variables in template such as page title
"""
context = super().get_context_data(**kwargs)
context['title'] = _('Transfer money from your account '
'to one or others')
2020-02-21 17:28:21 +00:00
context['no_cache'] = True
2019-07-17 11:53:58 +00:00
return context
2019-08-11 17:54:18 +00:00
def get_form(self, form_class=None):
"""
If the user has no right to transfer funds, then it won't have the choice of the source of the transfer.
"""
form = super().get_form(form_class)
2020-02-18 11:31:15 +00:00
if False: # TODO: fix it with "if %user has no right to transfer funds"
del form.fields['source']
2020-02-27 16:22:59 +00:00
form.user = self.request.user
return form
2020-02-27 16:22:59 +00:00
def get_success_url(self):
return reverse('note:transfer')
2020-02-08 19:23:17 +00:00
class NoteAutocomplete(autocomplete.Select2QuerySetView):
"""
Auto complete note by aliases
"""
2020-03-07 21:28:59 +00:00
2020-02-08 19:23:17 +00:00
def get_queryset(self):
2020-02-08 20:40:32 +00:00
"""
Quand une personne cherche un alias, une requête est envoyée sur l'API dédiée à l'auto-complétion.
2020-02-17 10:36:46 +00:00
Cette fonction récupère la requête, et renvoie la liste filtrée des aliases.
2020-02-08 20:40:32 +00:00
"""
# Un utilisateur non connecté n'a accès à aucune information
if not self.request.user.is_authenticated:
return Alias.objects.none()
qs = Alias.objects.all()
2020-02-08 19:23:17 +00:00
# self.q est le paramètre de la recherche
2020-02-08 19:23:17 +00:00
if self.q:
2020-03-07 21:28:59 +00:00
qs = qs.filter(Q(name__regex=self.q) | Q(normalized_name__regex=Alias.normalize(self.q))) \
.order_by('normalized_name').distinct()
2020-02-08 19:23:17 +00:00
# Filtrage par type de note (user, club, special)
note_type = self.forwarded.get("note_type", None)
if note_type:
2020-02-18 20:14:29 +00:00
types = str(note_type).lower()
if "user" in types:
qs = qs.filter(note__polymorphic_ctype__model="noteuser")
2020-02-18 20:14:29 +00:00
elif "club" in types:
qs = qs.filter(note__polymorphic_ctype__model="noteclub")
2020-02-18 20:14:29 +00:00
elif "special" in types:
qs = qs.filter(note__polymorphic_ctype__model="notespecial")
else:
qs = qs.none()
2020-02-08 19:23:17 +00:00
return qs
def get_result_label(self, result):
2020-02-17 10:36:46 +00:00
# Gère l'affichage de l'alias dans la recherche
res = result.name
note_name = str(result.note)
if res != note_name:
res += " (aka. " + note_name + ")"
return res
def get_result_value(self, result):
2020-02-17 10:36:46 +00:00
# Le résultat renvoyé doit être l'identifiant de la note, et non de l'alias
return str(result.note.pk)
2020-02-08 19:23:17 +00:00
2020-02-18 11:31:15 +00:00
class TransactionTemplateCreateView(LoginRequiredMixin, CreateView):
2019-08-11 17:54:18 +00:00
"""
Create TransactionTemplate
"""
model = TransactionTemplate
form_class = TransactionTemplateForm
2020-02-18 11:31:15 +00:00
class TransactionTemplateListView(LoginRequiredMixin, SingleTableView):
2019-08-11 17:54:18 +00:00
"""
List TransactionsTemplates
"""
model = TransactionTemplate
2020-03-10 19:17:56 +00:00
table_class = ButtonTable
2020-02-18 11:31:15 +00:00
class TransactionTemplateUpdateView(LoginRequiredMixin, UpdateView):
2019-08-11 17:54:18 +00:00
"""
"""
model = TransactionTemplate
2020-02-04 00:18:03 +00:00
form_class = TransactionTemplateForm
2020-02-18 11:31:15 +00:00
class ConsoView(LoginRequiredMixin, CreateView):
2020-02-04 00:18:03 +00:00
"""
Consume
"""
2020-02-24 09:36:04 +00:00
model = TemplateTransaction
2020-02-04 00:18:03 +00:00
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)
2020-02-23 17:56:03 +00:00
context['transaction_templates'] = TransactionTemplate.objects.filter(display=True) \
.order_by('category')
2020-02-21 21:40:58 +00:00
context['title'] = _("Consommations")
2020-02-04 00:18:03 +00:00
# select2 compatibility
2020-02-21 18:46:56 +00:00
context['no_cache'] = True
2020-02-04 00:18:03 +00:00
return context
def get_success_url(self):
2020-02-21 21:40:58 +00:00
"""
When clicking a button, reload the same page
"""
return reverse('note:consos')