admin.py 6.8 KB

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