admin.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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 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. ### Inlines
  14. class ProfileInline(admin.StackedInline):
  15. model = Profile
  16. def has_add_permission(self, request):
  17. return False
  18. def has_delete_permission(self, request, obj=None):
  19. return False
  20. class AdhesionInline(admin.StackedInline):
  21. model = Adhesion
  22. fields = ('id', 'active', 'notes',)
  23. def has_add_permission(self, request):
  24. return False
  25. def has_delete_permission(self, request, obj=None):
  26. return False
  27. class ServiceInline(admin.StackedInline):
  28. model = Service
  29. extra = 0
  30. show_change_link = True
  31. fields = ('service_type', 'label',)
  32. readonly_fields = ('service_type', 'label',)
  33. def has_add_permission(self, request):
  34. return False
  35. def has_delete_permission(self, request, obj=None):
  36. return False
  37. ### Filters
  38. class AdherentTypeFilter(admin.SimpleListFilter):
  39. title = 'type d’adhérent'
  40. parameter_name = 'type'
  41. def lookups(self, request, model_admin):
  42. return (
  43. ('physique', 'Personne physique'),
  44. ('morale', 'Personne morale'),
  45. )
  46. def queryset(self, request, queryset):
  47. if self.value() == 'physique':
  48. return queryset.filter(user__isnull=False)
  49. if self.value() == 'morale':
  50. return queryset.filter(corporation__isnull=False)
  51. ### Mixins
  52. class AdtSearchMixin:
  53. adhesion_search_field = 'id'
  54. def get_search_results(self, request, queryset, search_term):
  55. queryset, use_distinct = super().get_search_results(request, queryset, search_term)
  56. if search_term[:3] == 'ADT':
  57. try:
  58. adh_id = int(search_term[3:])
  59. except ValueError:
  60. pass
  61. else:
  62. queryset |= self.model.objects.filter(**{self.adhesion_search_field: adh_id})
  63. return queryset, use_distinct
  64. ### ModelAdmin
  65. class UserAdmin(AdtSearchMixin, AuthUserAdmin):
  66. list_display = AuthUserAdmin.list_display + ('get_adhesion_link',)
  67. list_select_related = ('profile', 'adhesion',)
  68. ordering = ('adhesion__id',)
  69. search_fields = AuthUserAdmin.search_fields + ('=adhesion__id', 'adhesion__notes',)
  70. readonly_fields = ('get_adhesion_link',)
  71. adhesion_search_field = 'adhesion__id'
  72. def get_adhesion_id(self, user):
  73. return user.adhesion
  74. get_adhesion_id.short_description = 'Numéro d’adhérent'
  75. get_adhesion_id.admin_order_field = 'adhesion__id'
  76. get_adhesion_link = lambda self, corporation: corporation.adhesion.get_adhesion_link()
  77. get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description
  78. def get_inline_instances(self, request, obj=None):
  79. if obj:
  80. inlines = (ProfileInline, AdhesionInline,)
  81. else:
  82. inlines = ()
  83. return [inline(self.model, self.admin_site) for inline in inlines]
  84. def get_form(self, request, obj=None, **kwargs):
  85. if obj:
  86. return super().get_form(request, obj, **kwargs)
  87. else:
  88. return UserCreationForm
  89. def get_fieldsets(self, request, obj=None):
  90. if obj:
  91. fieldsets = (
  92. (AuthUserAdmin.fieldsets[1][0], {
  93. 'fields': ('get_adhesion_link',) + AuthUserAdmin.fieldsets[1][1]['fields'],
  94. }),
  95. ('Nom d’utilisateur et mot de passe', {
  96. 'classes': ('collapse',),
  97. 'fields': AuthUserAdmin.fieldsets[0][1]['fields'],
  98. }),
  99. (AuthUserAdmin.fieldsets[2][0], {
  100. 'classes': ('collapse',),
  101. 'fields': ('is_active', 'is_staff', 'is_superuser',), # removing groups and user_permissions
  102. }),
  103. (AuthUserAdmin.fieldsets[3][0], {
  104. 'classes': ('collapse',),
  105. 'fields': AuthUserAdmin.fieldsets[3][1]['fields'],
  106. }),
  107. )
  108. else:
  109. fieldsets = (
  110. (None, {
  111. 'fields': ('first_name', 'last_name', 'username', 'email',),
  112. }),
  113. )
  114. return fieldsets
  115. def get_actions(self, request):
  116. actions = super().get_actions(request)
  117. if 'delete_selected' in actions:
  118. del actions['delete_selected']
  119. return actions
  120. def has_delete_permission(self, request, obj=None):
  121. return obj and not obj.adhesion
  122. class CorporationAdmin(AdtSearchMixin, admin.ModelAdmin):
  123. list_display = ('social_reason', 'get_adhesion_link',)
  124. list_select_related = ('adhesion',)
  125. ordering = ('adhesion__id',)
  126. search_fields = ('social_reason', 'description', 'email', 'phone_number', 'address', 'notes', 'adhesion__id', 'adhesion__notes',)
  127. readonly_fields = ('get_adhesion_link',)
  128. filter_horizontal = ('members',)
  129. adhesion_search_field = 'adhesion__id'
  130. def get_adhesion_id(self, corp):
  131. return corp.adhesion
  132. get_adhesion_id.short_description = 'Numéro d’adhérent'
  133. get_adhesion_id.admin_order_field = 'adhesion__id'
  134. get_adhesion_link = lambda self, corporation: corporation.adhesion.get_adhesion_link()
  135. get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description
  136. def get_inline_instances(self, request, obj=None):
  137. if obj:
  138. inlines = (AdhesionInline,)
  139. else:
  140. inlines = ()
  141. return [inline(self.model, self.admin_site) for inline in inlines]
  142. def get_actions(self, request):
  143. actions = super().get_actions(request)
  144. if 'delete_selected' in actions:
  145. del actions['delete_selected']
  146. return actions
  147. def get_fieldsets(self, request, obj=None):
  148. fieldsets = super().get_fieldsets(request, obj)
  149. # put adhesion id on top
  150. if obj:
  151. fields = fieldsets[0][1]['fields']
  152. fields.remove('get_adhesion_link')
  153. fieldsets = (
  154. (None, {
  155. 'fields': ['get_adhesion_link'] + fields,
  156. }),
  157. )
  158. return fieldsets
  159. def has_delete_permission(self, request, obj=None):
  160. return False
  161. class AdhesionAdmin(AdtSearchMixin, admin.ModelAdmin):
  162. list_display = ('get_id', 'type', 'get_adherent_link',)
  163. list_filter = (AdherentTypeFilter, 'active',)
  164. list_select_related = ('user', 'user__profile', 'corporation',)
  165. fields = ('id', 'type', 'get_adherent_link',)
  166. readonly_fields = ('id', 'type', 'get_adherent_link',)
  167. search_fields = ('=id', 'notes',) \
  168. + tuple(['user__%s' % f for f in UserAdmin.search_fields if '__' not in f]) \
  169. + tuple(['corporation__%s' % f for f in CorporationAdmin.search_fields if '__' not in f])
  170. inlines = (ServiceInline,)#PaymentInline,)
  171. def get_id(self, obj):
  172. return 'ADT%d' % obj.id
  173. get_id.short_description = 'Numéro d’adhérent'
  174. get_id.admin_order_field = 'id'
  175. def get_actions(self, request):
  176. actions = super().get_actions(request)
  177. if 'delete_selected' in actions:
  178. del actions['delete_selected']
  179. return actions
  180. def has_add_permission(self, request):
  181. return False
  182. def has_delete_permission(self, request, obj=None):
  183. return False
  184. admin.site.unregister(AuthUser)
  185. admin.site.unregister(Group)
  186. admin.site.register(User, UserAdmin)
  187. admin.site.register(Corporation, CorporationAdmin)
  188. admin.site.register(Adhesion, AdhesionAdmin)