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