admin.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. from django.contrib import admin
  2. from django.contrib.auth.models import User, Group
  3. from django.contrib.contenttypes.admin import GenericStackedInline, GenericTabularInline
  4. from django.db.models import Q
  5. from django.contrib.contenttypes.models import ContentType
  6. from django.contrib.auth.admin import UserAdmin as AuthUserAdmin
  7. from .forms import AdhesionForm
  8. from .models import ProxyUser, Corporation, Adhesion
  9. from accounts.models import Profile
  10. from services.models import Service
  11. from banking.admin import PaymentInline
  12. class AdhesionInline(GenericTabularInline):
  13. model = Adhesion
  14. ct_field = 'adherent_type'
  15. ct_fk_field = 'adherent_id'
  16. form = AdhesionForm
  17. min_num = 1
  18. max_num = 1
  19. extra = 0
  20. show_change_link = True
  21. def has_delete_permission(self, request, obj=None):
  22. return False
  23. class ProfileInline(admin.StackedInline):
  24. model = Profile
  25. def has_add_permission(self, request):
  26. return False
  27. def has_delete_permission(self, request, obj=None):
  28. return False
  29. class ServiceInline(admin.StackedInline):
  30. model = Service
  31. extra = 0
  32. show_change_link = True
  33. fields = ('service_type', 'label',)
  34. readonly_fields = ('service_type', 'label',)
  35. def has_add_permission(self, request):
  36. return False
  37. def has_delete_permission(self, request, obj=None):
  38. return False
  39. class UserIsAdherentFilter(admin.SimpleListFilter):
  40. title = 'status adhérent'
  41. parameter_name = 'adherent'
  42. def lookups(self, request, model_admin):
  43. return (
  44. ('1', 'Oui'),
  45. ('0', 'Non'),
  46. )
  47. def queryset(self, request, queryset):
  48. adhesion_list = Adhesion.objects.values_list('adherent_id')
  49. if self.value() == '0':
  50. return queryset.exclude(pk__in=adhesion_list)
  51. if self.value() == '1':
  52. return queryset.filter(pk__in=adhesion_list)
  53. class UserAdmin(AuthUserAdmin):
  54. list_display = AuthUserAdmin.list_display + ('adherent_id',)
  55. list_filter = (AuthUserAdmin.list_filter[2], UserIsAdherentFilter) # [2] = actif
  56. inlines = (ProfileInline, AdhesionInline,)
  57. def adherent_id(self, user):
  58. adherent = user.profile.adhesion
  59. if adherent:
  60. return adherent.id
  61. adherent_id.short_description = 'Numéro d’adhérent'
  62. def get_fieldsets(self, request, obj=None):
  63. return (
  64. AuthUserAdmin.fieldsets[0],
  65. AuthUserAdmin.fieldsets[1],
  66. (AuthUserAdmin.fieldsets[2][0], {
  67. 'classes': ('collapse',),
  68. 'fields': ('is_active', 'is_staff', 'is_superuser',), # removing groups and user_permissions
  69. }),
  70. (AuthUserAdmin.fieldsets[3][0], {
  71. 'classes': ('collapse',),
  72. 'fields': AuthUserAdmin.fieldsets[3][1]['fields'],
  73. }),
  74. )
  75. def get_actions(self, request):
  76. actions = super().get_actions(request)
  77. if 'delete_selected' in actions:
  78. del actions['delete_selected']
  79. return actions
  80. def has_delete_permission(self, request, obj=None):
  81. return obj and not obj.profile.adhesion
  82. class AdherentTypeFilter(admin.SimpleListFilter):
  83. title = 'type d’adhérent'
  84. parameter_name = 'type'
  85. def lookups(self, request, model_admin):
  86. return (
  87. ('physique', 'Personne physique'),
  88. ('morale', 'Personne morale'),
  89. )
  90. def queryset(self, request, queryset):
  91. if self.value() == 'physique':
  92. return queryset.filter(adherent_type__app_label='auth',
  93. adherent_type__model='user')
  94. if self.value() == 'morale':
  95. return queryset.filter(adherent_type__app_label='adhesions',
  96. adherent_type__model='corporation')
  97. class AdhesionAdmin(admin.ModelAdmin):
  98. list_display = ('get_id', 'get_adherent_link', 'type',)
  99. list_filter = (AdherentTypeFilter,)
  100. fields = ('id', 'type', 'get_adherent_link',)
  101. readonly_fields = ('id', 'type', 'get_adherent_link',)
  102. search_fields = ('id',)
  103. inlines = (ServiceInline,)#PaymentInline,)
  104. def get_id(self, obj):
  105. return 'ADT%d' % obj.id
  106. get_id.short_description = 'Numéro d’adhérent'
  107. def get_search_results(self, request, queryset, search_term):
  108. queryset, use_distinct = super().get_search_results(request, queryset, search_term)
  109. users = User.objects.filter(
  110. Q(username__icontains=search_term)
  111. | Q(first_name__icontains=search_term)
  112. | Q(last_name__icontains=search_term)
  113. )
  114. user_type = ContentType.objects.get_for_model(User)
  115. queryset |= Adhesion.objects.filter(adherent_type=user_type,
  116. adherent_id__in=users.values_list('pk'))
  117. corporations = Corporation.objects.filter(social_reason__icontains=search_term)
  118. corporation_type = ContentType.objects.get_for_model(Corporation)
  119. queryset |= Adhesion.objects.filter(adherent_type=corporation_type,
  120. adherent_id__in=corporations.values_list('pk'))
  121. return queryset, use_distinct
  122. def get_actions(self, request):
  123. actions = super().get_actions(request)
  124. if 'delete_selected' in actions:
  125. del actions['delete_selected']
  126. return actions
  127. def has_add_permission(self, request):
  128. return False
  129. def has_delete_permission(self, request, obj=None):
  130. return False
  131. class CorporationAdmin(admin.ModelAdmin):
  132. list_display = ('social_reason', 'adherent_id')
  133. inlines = (AdhesionInline,)
  134. search_fields = ('social_reason',)
  135. filter_horizontal = ('members',)
  136. def adherent_id(self, corporation):
  137. adherent = corporation.adhesion
  138. if adherent:
  139. return adherent.id
  140. adherent_id.short_description = 'Numéro d’adhérent'
  141. def get_actions(self, request):
  142. actions = super().get_actions(request)
  143. if 'delete_selected' in actions:
  144. del actions['delete_selected']
  145. return actions
  146. def has_delete_permission(self, request, obj=None):
  147. return obj and not obj.adhesion
  148. admin.site.unregister(User)
  149. admin.site.unregister(Group)
  150. admin.site.register(ProxyUser, UserAdmin)
  151. admin.site.register(Corporation, CorporationAdmin)
  152. admin.site.register(Adhesion, AdhesionAdmin)