from django.contrib import admin from django.contrib.contenttypes.admin import GenericStackedInline, GenericTabularInline from django.db.models import Q from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import User as AuthUser, Group from django.contrib.auth.admin import UserAdmin as AuthUserAdmin from django.http import HttpResponseRedirect from .forms import UserCreationForm from .models import User, Corporation, Adhesion from accounts.models import Profile from services.models import Service from banking.admin import PaymentInline ### Inlines class ProfileInline(admin.StackedInline): model = Profile def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False class AdhesionInline(admin.StackedInline): model = Adhesion fields = ('id', 'active', 'notes',) def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False class ServiceInline(admin.StackedInline): model = Service extra = 0 show_change_link = True fields = ('service_type', 'label',) readonly_fields = ('service_type', 'label',) def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False ### Filters class AdherentTypeFilter(admin.SimpleListFilter): title = 'type d’adhérent' parameter_name = 'type' def lookups(self, request, model_admin): return ( ('physique', 'Personne physique'), ('morale', 'Personne morale'), ) def queryset(self, request, queryset): if self.value() == 'physique': return queryset.filter(user__isnull=False) if self.value() == 'morale': return queryset.filter(corporation__isnull=False) ### Mixins class AdtSearchMixin: adhesion_search_field = 'id' def get_search_results(self, request, queryset, search_term): queryset, use_distinct = super().get_search_results(request, queryset, search_term) if search_term[:3] == 'ADT': try: adh_id = int(search_term[3:]) except ValueError: pass else: queryset |= self.model.objects.filter(**{self.adhesion_search_field: adh_id}) return queryset, use_distinct ### ModelAdmin class UserAdmin(AdtSearchMixin, AuthUserAdmin): list_display = AuthUserAdmin.list_display + ('get_adhesion_link',) list_select_related = ('profile', 'adhesion',) ordering = ('adhesion__id',) search_fields = AuthUserAdmin.search_fields + ('=adhesion__id', 'adhesion__notes',) readonly_fields = ('get_adhesion_link',) adhesion_search_field = 'adhesion__id' def get_adhesion_id(self, user): return user.adhesion get_adhesion_id.short_description = 'Numéro d’adhérent' get_adhesion_id.admin_order_field = 'adhesion__id' get_adhesion_link = lambda self, corporation: corporation.adhesion.get_adhesion_link() get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description def get_inline_instances(self, request, obj=None): if obj: inlines = (ProfileInline, AdhesionInline,) else: inlines = () return [inline(self.model, self.admin_site) for inline in inlines] def get_form(self, request, obj=None, **kwargs): if obj: return super().get_form(request, obj, **kwargs) else: return UserCreationForm def get_fieldsets(self, request, obj=None): if obj: fieldsets = ( (AuthUserAdmin.fieldsets[1][0], { 'fields': ('get_adhesion_link',) + AuthUserAdmin.fieldsets[1][1]['fields'], }), ('Nom d’utilisateur et mot de passe', { 'classes': ('collapse',), 'fields': AuthUserAdmin.fieldsets[0][1]['fields'], }), (AuthUserAdmin.fieldsets[2][0], { 'classes': ('collapse',), 'fields': ('is_active', 'is_staff', 'is_superuser',), # removing groups and user_permissions }), (AuthUserAdmin.fieldsets[3][0], { 'classes': ('collapse',), 'fields': AuthUserAdmin.fieldsets[3][1]['fields'], }), ) else: fieldsets = ( (None, { 'fields': ('first_name', 'last_name', 'username', 'email',), }), ) return fieldsets def get_actions(self, request): actions = super().get_actions(request) if 'delete_selected' in actions: del actions['delete_selected'] return actions def has_delete_permission(self, request, obj=None): return obj and not obj.adhesion class CorporationAdmin(AdtSearchMixin, admin.ModelAdmin): list_display = ('social_reason', 'get_adhesion_link',) list_select_related = ('adhesion',) ordering = ('adhesion__id',) search_fields = ('social_reason', 'description', 'email', 'phone_number', 'address', 'notes', 'adhesion__id', 'adhesion__notes',) readonly_fields = ('get_adhesion_link',) filter_horizontal = ('members',) adhesion_search_field = 'adhesion__id' def get_adhesion_id(self, corp): return corp.adhesion get_adhesion_id.short_description = 'Numéro d’adhérent' get_adhesion_id.admin_order_field = 'adhesion__id' get_adhesion_link = lambda self, corporation: corporation.adhesion.get_adhesion_link() get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description def get_inline_instances(self, request, obj=None): if obj: inlines = (AdhesionInline,) else: inlines = () return [inline(self.model, self.admin_site) for inline in inlines] def get_actions(self, request): actions = super().get_actions(request) if 'delete_selected' in actions: del actions['delete_selected'] return actions def get_fieldsets(self, request, obj=None): fieldsets = super().get_fieldsets(request, obj) # put adhesion id on top if obj: fields = fieldsets[0][1]['fields'] fields.remove('get_adhesion_link') fieldsets = ( (None, { 'fields': ['get_adhesion_link'] + fields, }), ) return fieldsets def has_delete_permission(self, request, obj=None): return False class AdhesionAdmin(AdtSearchMixin, admin.ModelAdmin): list_display = ('get_id', 'type', 'get_adherent_link',) list_filter = (AdherentTypeFilter, 'active',) list_select_related = ('user', 'user__profile', 'corporation',) fields = ('id', 'type', 'get_adherent_link',) readonly_fields = ('id', 'type', 'get_adherent_link',) search_fields = ('=id', 'notes',) \ + tuple(['user__%s' % f for f in UserAdmin.search_fields if '__' not in f]) \ + tuple(['corporation__%s' % f for f in CorporationAdmin.search_fields if '__' not in f]) inlines = (ServiceInline,)#PaymentInline,) def get_id(self, obj): return 'ADT%d' % obj.id get_id.short_description = 'Numéro d’adhérent' get_id.admin_order_field = 'id' def get_actions(self, request): actions = super().get_actions(request) if 'delete_selected' in actions: del actions['delete_selected'] return actions def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False admin.site.unregister(AuthUser) admin.site.unregister(Group) admin.site.register(User, UserAdmin) admin.site.register(Corporation, CorporationAdmin) admin.site.register(Adhesion, AdhesionAdmin)