admin.py 5.8 KB

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