Préparation du code pour le système de droits & filtrage par type de note pour l'auto-complétion

This commit is contained in:
Yohann D'ANELLO 2020-02-08 23:24:49 +01:00
parent 142b3359e3
commit 732f8bc3d8
3 changed files with 54 additions and 5 deletions

View File

@ -125,6 +125,10 @@ class UserAutocomplete(autocomplete.Select2QuerySetView):
Quand une personne cherche un utilisateur par pseudo, une requête est envoyée sur l'API dédiée à l'auto-complétion. Quand une personne cherche un utilisateur par pseudo, 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 utilisateurs par pseudos. Cette fonction récupère la requête, et renvoie la liste filtrée des utilisateurs par pseudos.
""" """
# Un utilisateur non connecté n'a accès à aucune information
if not self.request.user.is_authenticated:
return User.objects.none()
qs = User.objects.all() qs = User.objects.all()
if self.q: if self.q:

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
from dal import autocomplete from dal import autocomplete, forward
from django import forms from django import forms
from .models import Transaction, TransactionTemplate from .models import Transaction, TransactionTemplate
@ -12,6 +12,8 @@ class TransactionTemplateForm(forms.ModelForm):
# Le champ de destination est remplacé par un champ d'auto-complétion. # Le champ de destination est remplacé par un champ d'auto-complétion.
# Quand des lettres sont tapées, une requête est envoyée sur l'API d'auto-complétion # Quand des lettres sont tapées, une requête est envoyée sur l'API d'auto-complétion
# et récupère les aliases valides # et récupère les aliases valides
# Pour force le type d'une note, il faut rajouter le paramètre :
# forward=(forward.Const('TYPE', 'note_type') où TYPE est dans {user, club, special}
widgets = { widgets = {
'destination': autocomplete.ModelSelect2(url='note:note_autocomplete', 'destination': autocomplete.ModelSelect2(url='note:note_autocomplete',
attrs={ attrs={
@ -22,9 +24,14 @@ class TransactionTemplateForm(forms.ModelForm):
class TransactionForm(forms.ModelForm): class TransactionForm(forms.ModelForm):
def save(self, commit=True):
self.instance.transaction_type = 'transfert'
super().save(commit)
class Meta: class Meta:
model = Transaction model = Transaction
fields = ('destination', 'reason', 'amount',) fields = ('source', 'destination', 'reason', 'amount',)
# Voir ci-dessus # Voir ci-dessus
widgets = { widgets = {
@ -32,11 +39,10 @@ class TransactionForm(forms.ModelForm):
attrs={ attrs={
'data-placeholder': 'Note ...', 'data-placeholder': 'Note ...',
'data-minimum-input-length': 1, 'data-minimum-input-length': 1,
}), },),
'destination': autocomplete.ModelSelect2(url='note:note_autocomplete', 'destination': autocomplete.ModelSelect2(url='note:note_autocomplete',
attrs={ attrs={
'data-placeholder': 'Note ...', 'data-placeholder': 'Note ...',
'data-minimum-input-length': 1, 'data-minimum-input-length': 1,
}), },),
} }

View File

@ -30,6 +30,27 @@ class TransactionCreate(LoginRequiredMixin, CreateView):
return context return context
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)
if False: # TODO: fix it with "if %user has no right to transfer funds"
del form.fields['source']
return form
def form_valid(self, form):
"""
If the user has no right to transfer funds, then it will be the source of the transfer by default.
"""
if False: # TODO: fix it with "if %user has no right to transfer funds"
form.instance.source = self.request.user.note
return super().form_valid(form)
class NoteAutocomplete(autocomplete.Select2QuerySetView): class NoteAutocomplete(autocomplete.Select2QuerySetView):
""" """
Auto complete note by aliases Auto complete note by aliases
@ -40,11 +61,29 @@ class NoteAutocomplete(autocomplete.Select2QuerySetView):
Quand une personne cherche un alias, une requête est envoyée sur l'API dédiée à l'auto-complétion. 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 notes par aliases. Cette fonction récupère la requête, et renvoie la liste filtrée des notes par aliases.
""" """
# Un utilisateur non connecté n'a accès à aucune information
if not self.request.user.is_authenticated:
return Note.objects.none()
qs = Note.objects.all() qs = Note.objects.all()
# self.q est le paramètre de la recherche
if self.q: if self.q:
qs = qs.filter(Q(alias__name__regex=self.q) | Q(alias__normalized_name__regex=self.q)) qs = qs.filter(Q(alias__name__regex=self.q) | Q(alias__normalized_name__regex=self.q))
# Filtrage par type de note (user, club, special)
note_type = self.forwarded.get("note_type", None)
if note_type:
l = str(note_type).lower()
if "user" in l:
qs = qs.filter(polymorphic_ctype__model="noteuser")
elif "club" in l:
qs = qs.filter(polymorphic_ctype__model="noteclub")
elif "special" in l:
qs = qs.filter(polymorphic_ctype__model="notespecial")
else:
qs = qs.none()
return qs return qs