admin.py 5.9 KB

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