facture: factorize CPFFilter (#89413)
gitea/barbacompta/pipeline/head This commit looks good Details

This commit is contained in:
Benjamin Dauvergne 2024-04-11 09:46:19 +02:00
parent 2f7de56432
commit 7384549e1a
2 changed files with 40 additions and 52 deletions

View File

@ -124,39 +124,43 @@ class ActiveFilter(admin.SimpleListFilter):
return queryset.filter(active=bool(self.value() == 'True'))
class MyClientsFilter(admin.SimpleListFilter):
class CPFFilter(admin.SimpleListFilter):
title = 'CPF'
parameter_name = 'cpf'
def __init__(self, request, params, model, model_admin):
super().__init__(request, params, model, model_admin)
self.request = request
self.user = request.user
@classmethod
def user_has_clients(self, user):
return user and user.project_set.filter(client__isnull=False).exists()
def value(self):
from eo_gestion.eo_redmine.models import Project
value = super().value()
default_value = 'all'
user = self.request.user
if user and user.project_set.exists():
default_value = 'True'
return value if value in ('True', 'all') else default_value
return value if value in ('mine', 'all') else 'mine'
def choices(self, changelist):
choices = list(super().choices(changelist))
return choices[1:] # don't include automatic "All"
def lookups(self, request, model_admin):
return [('all', 'tous'), ('True', 'mes clients')]
return [
('mine', 'Mes clients'),
('all', 'Tous'),
]
def queryset(self, request, queryset):
if self.value() == 'True':
return queryset.filter(
Exists(models.Client.objects.filter(project__cpfs=request.user, id=OuterRef('pk')))
)
else:
return queryset
if self.value() == 'mine':
return self.filter_by_cpf(queryset)
return queryset
class MyClientsFilter(CPFFilter):
def filter_by_cpf(self, queryset):
return queryset.filter(
Exists(models.Client.objects.filter(project__cpfs=self.user, id=OuterRef('pk')))
)
class LastBillAgeFilter(admin.SimpleListFilter):
@ -187,13 +191,19 @@ class ClientAdmin(admin.ModelAdmin):
form = forms.ClientForm
list_display = ['nom', 'adresse', 'email', 'telephone']
list_editable = ['email', 'telephone']
list_filter = [ActiveFilter, MyClientsFilter, LastBillAgeFilter]
list_filter = [ActiveFilter, LastBillAgeFilter]
ordering = ['nom']
search_fields = ['nom', 'email']
save_on_top = True
list_select_related = True
raw_id_fields = ['chorus_structure']
def get_list_filter(self, request):
list_filter = super().get_list_filter(request)
if CPFFilter.user_has_clients(request.user):
list_filter = [MyClientsFilter] + list_filter
return list_filter
def get_readonly_fields(self, request, obj=None):
readonly_fields = super().get_readonly_fields(request, obj=obj)
if obj and obj.chorus_structure:
@ -221,37 +231,9 @@ def show_client(obj):
return ''
class MyContratsFilter(admin.SimpleListFilter):
title = 'CPF'
parameter_name = 'cpf'
def __init__(self, request, params, model, model_admin):
super().__init__(request, params, model, model_admin)
self.request = request
def value(self):
from eo_gestion.eo_redmine.models import Project
value = super().value()
default_value = 'all'
user = self.request.user
if user and user.project_set.exists():
default_value = 'True'
return value if value in ('True', 'all') else default_value
def choices(self, changelist):
choices = list(super().choices(changelist))
return choices[1:] # don't include automatic "All"
def lookups(self, request, model_admin):
return [('all', 'tous'), ('True', 'mes clients')]
def queryset(self, request, queryset):
if self.value() == 'True':
return queryset.filter(client__in=models.Client.objects.filter(project__cpfs=request.user))
else:
return queryset
class MyContratsFilter(CPFFilter):
def filter_by_cpf(self, queryset):
return queryset.filter(client__in=models.Client.objects.filter(project__cpfs=self.user))
class ContratAdmin(LookupAllowed, admin.ModelAdmin):
@ -268,7 +250,7 @@ class ContratAdmin(LookupAllowed, admin.ModelAdmin):
'creator',
'tag_list',
]
list_filter = ['tags', MyContratsFilter, 'client']
list_filter = ['tags', 'client']
list_select_related = True
save_on_top = True
search_fields = ['intitule', 'client__nom', 'tags__name']
@ -277,6 +259,12 @@ class ContratAdmin(LookupAllowed, admin.ModelAdmin):
actions = [actions.export_references_as_fodt]
autocomplete_fields = ['client']
def get_list_filter(self, request):
list_filter = super().get_list_filter(request)
if CPFFilter.user_has_clients(request.user):
list_filter = [MyContratsFilter] + list_filter
return list_filter
@admin.display(description='Montant')
def column_montant(self, obj):
return amountformat(obj.montant())

View File

@ -111,12 +111,12 @@ class TestLoggedIn:
def test_mes_clients(self, app):
response = app.get('/eo_facture/client/')
assert response.pyquery('li.selected [title="mes clients"]')
assert response.pyquery('li.selected [title="Mes clients"]')
assert len(response.pyquery('tbody tr')) == 2
Project.objects.all().delete()
response = app.get('/eo_facture/client/')
assert response.pyquery('li.selected [title="tous"]')
assert 'Mes clients' not in response
assert len(response.pyquery('tbody tr')) > 2
def test_derniere_facture(self, app):