facture: factorize CPFFilter (#89413)
gitea/barbacompta/pipeline/head This commit looks good
Details
gitea/barbacompta/pipeline/head This commit looks good
Details
This commit is contained in:
parent
2f7de56432
commit
7384549e1a
|
@ -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())
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue