admin.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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 + ('get_adhesion_link',)
  56. list_filter = AuthUserAdmin.list_filter + (UserIsAdherentFilter,)
  57. readonly_fields = ('get_adhesion_link',)
  58. def get_adhesion_link(self, user):
  59. adhesion = user.adhesion
  60. if adhesion:
  61. return adhesion.get_adhesion_link()
  62. get_adhesion_link.short_description = 'Numéro d’adhérent'
  63. def get_form(self, request, obj=None, **kwargs):
  64. if obj:
  65. if obj.profile.adhesion:
  66. UserAdmin.inlines = (ProfileInline,)
  67. else:
  68. UserAdmin.inlines = (ProfileInline, AdhesionInline,)
  69. return super().get_form(request, obj, **kwargs)
  70. else:
  71. UserAdmin.inlines = (AdhesionInline,)
  72. return UserCreationForm
  73. def get_fieldsets(self, request, obj=None):
  74. if obj:
  75. fieldsets = (
  76. AuthUserAdmin.fieldsets[1],
  77. ('Nom d’utilisateur et mot de passe', {
  78. 'classes': ('collapse',),
  79. 'fields': AuthUserAdmin.fieldsets[0][1]['fields'],
  80. }),
  81. (AuthUserAdmin.fieldsets[2][0], {
  82. 'classes': ('collapse',),
  83. 'fields': ('is_active', 'is_staff', 'is_superuser',), # removing groups and user_permissions
  84. }),
  85. (AuthUserAdmin.fieldsets[3][0], {
  86. 'classes': ('collapse',),
  87. 'fields': AuthUserAdmin.fieldsets[3][1]['fields'],
  88. }),
  89. )
  90. if obj.profile.adhesion:
  91. fieldsets = (
  92. (None, {
  93. 'fields': ('get_adhesion_link',),
  94. }),
  95. ) + fieldsets
  96. else:
  97. fieldsets = (
  98. (None, {
  99. 'fields': ('first_name', 'last_name', 'username',),
  100. }),
  101. )
  102. return fieldsets
  103. def get_actions(self, request):
  104. actions = super().get_actions(request)
  105. if 'delete_selected' in actions:
  106. del actions['delete_selected']
  107. return actions
  108. def has_delete_permission(self, request, obj=None):
  109. return obj and not obj.adhesion
  110. class AdherentTypeFilter(admin.SimpleListFilter):
  111. title = 'type d’adhérent'
  112. parameter_name = 'type'
  113. def lookups(self, request, model_admin):
  114. return (
  115. ('physique', 'Personne physique'),
  116. ('morale', 'Personne morale'),
  117. )
  118. def queryset(self, request, queryset):
  119. if self.value() == 'physique':
  120. return queryset.filter(adherent_type__app_label='auth',
  121. adherent_type__model='user')
  122. if self.value() == 'morale':
  123. return queryset.filter(adherent_type__app_label='adhesions',
  124. adherent_type__model='corporation')
  125. class AdhesionAdmin(admin.ModelAdmin):
  126. list_display = ('get_id', 'type', 'get_adherent_link', 'active')
  127. list_filter = (AdherentTypeFilter, 'active',)
  128. fields = ('id', 'type', 'get_adherent_link', 'active', 'notes')
  129. readonly_fields = ('id', 'type', 'get_adherent_link',)
  130. search_fields = ('=id', 'notes',)
  131. inlines = (ServiceInline,)#PaymentInline,)
  132. def get_id(self, obj):
  133. return 'ADT%d' % obj.id
  134. get_id.short_description = 'Numéro d’adhérent'
  135. def get_search_results(self, request, queryset, search_term):
  136. queryset, use_distinct = super().get_search_results(request, queryset, search_term)
  137. users = User.objects.filter(
  138. Q(username__icontains=search_term)
  139. | Q(first_name__icontains=search_term)
  140. | Q(last_name__icontains=search_term)
  141. )
  142. user_type = ContentType.objects.get_for_model(User)
  143. queryset |= Adhesion.objects.filter(adherent_type=user_type,
  144. adherent_id__in=users.values_list('pk'))
  145. corporations = Corporation.objects.filter(social_reason__icontains=search_term)
  146. corporation_type = ContentType.objects.get_for_model(Corporation)
  147. queryset |= Adhesion.objects.filter(adherent_type=corporation_type,
  148. adherent_id__in=corporations.values_list('pk'))
  149. return queryset, use_distinct
  150. def get_actions(self, request):
  151. actions = super().get_actions(request)
  152. if 'delete_selected' in actions:
  153. del actions['delete_selected']
  154. return actions
  155. def has_add_permission(self, request):
  156. return False
  157. def has_delete_permission(self, request, obj=None):
  158. return False
  159. class CorporationAdmin(admin.ModelAdmin):
  160. list_display = ('social_reason', 'get_adhesion_link')
  161. search_fields = ('social_reason',)
  162. filter_horizontal = ('members',)
  163. def get_adhesion_link(self, corp):
  164. adhesion = corp.adhesion
  165. if adhesion:
  166. return adhesion.get_adhesion_link()
  167. get_adhesion_link.short_description = 'Numéro d’adhérent'
  168. def get_actions(self, request):
  169. actions = super().get_actions(request)
  170. if 'delete_selected' in actions:
  171. del actions['delete_selected']
  172. return actions
  173. def get_readonly_fields(self, request, obj=None):
  174. readonly_fields = super().get_readonly_fields(request, obj)
  175. if obj and obj.adhesion:
  176. readonly_fields += ('get_adhesion_link',)
  177. return readonly_fields
  178. def get_fieldsets(self, request, obj=None):
  179. fieldsets = super().get_fieldsets(request, obj)
  180. # put adhesion_link on top
  181. if obj and obj.adhesion:
  182. CorporationAdmin.inlines = ()
  183. fields = fieldsets[0][1]['fields']
  184. fields.remove('get_adhesion_link')
  185. fieldsets = (
  186. (None, {
  187. 'fields': ['get_adhesion_link'] + fields,
  188. }),
  189. )
  190. else:
  191. CorporationAdmin.inlines = (AdhesionInline,)
  192. return fieldsets
  193. def has_delete_permission(self, request, obj=None):
  194. return obj and not obj.adhesion
  195. admin.site.unregister(AuthUser)
  196. admin.site.unregister(Group)
  197. admin.site.register(User, UserAdmin)
  198. admin.site.register(Corporation, CorporationAdmin)
  199. admin.site.register(Adhesion, AdhesionAdmin)