from django.contrib import admin from django.contrib.auth.models import User, Group 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.admin import UserAdmin as AuthUserAdmin from .forms import AdhesionForm from .models import ProxyUser, Corporation, Adhesion from accounts.models import Profile from services.models import Service from banking.admin import PaymentInline class AdhesionInline(GenericTabularInline): model = Adhesion ct_field = 'adherent_type' ct_fk_field = 'adherent_id' form = AdhesionForm min_num = 1 max_num = 1 extra = 0 show_change_link = True def has_delete_permission(self, request, obj=None): return False 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 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 class UserIsAdherentFilter(admin.SimpleListFilter): title = 'status adhérent' parameter_name = 'adherent' def lookups(self, request, model_admin): return ( ('1', 'Oui'), ('0', 'Non'), ) def queryset(self, request, queryset): adhesion_list = Adhesion.objects.values_list('adherent_id') if self.value() == '0': return queryset.exclude(pk__in=adhesion_list) if self.value() == '1': return queryset.filter(pk__in=adhesion_list) class UserAdmin(AuthUserAdmin): list_display = AuthUserAdmin.list_display + ('adherent_id',) list_filter = (AuthUserAdmin.list_filter[2], UserIsAdherentFilter) # [2] = actif inlines = (ProfileInline, AdhesionInline,) def adherent_id(self, user): adherent = user.profile.adhesion if adherent: return adherent.id adherent_id.short_description = 'Numéro d’adhérent' def get_fieldsets(self, request, obj=None): return ( AuthUserAdmin.fieldsets[0], AuthUserAdmin.fieldsets[1], (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'], }), ) 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.profile.adhesion 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(adherent_type__app_label='auth', adherent_type__model='user') if self.value() == 'morale': return queryset.filter(adherent_type__app_label='adhesions', adherent_type__model='corporation') class AdhesionAdmin(admin.ModelAdmin): list_display = ('get_id', 'get_adherent_link', 'type',) list_filter = (AdherentTypeFilter,) fields = ('id', 'type', 'get_adherent_link',) readonly_fields = ('id', 'type', 'get_adherent_link',) search_fields = ('id',) inlines = (ServiceInline,)#PaymentInline,) def get_id(self, obj): return 'ADT%d' % obj.id get_id.short_description = 'Numéro d’adhérent' def get_search_results(self, request, queryset, search_term): queryset, use_distinct = super().get_search_results(request, queryset, search_term) users = User.objects.filter( Q(username__icontains=search_term) | Q(first_name__icontains=search_term) | Q(last_name__icontains=search_term) ) user_type = ContentType.objects.get_for_model(User) queryset |= Adhesion.objects.filter(adherent_type=user_type, adherent_id__in=users.values_list('pk')) corporations = Corporation.objects.filter(social_reason__icontains=search_term) corporation_type = ContentType.objects.get_for_model(Corporation) queryset |= Adhesion.objects.filter(adherent_type=corporation_type, adherent_id__in=corporations.values_list('pk')) return queryset, use_distinct 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 class CorporationAdmin(admin.ModelAdmin): list_display = ('social_reason', 'adherent_id') inlines = (AdhesionInline,) search_fields = ('social_reason',) filter_horizontal = ('members',) def adherent_id(self, corporation): adherent = corporation.adhesion if adherent: return adherent.id adherent_id.short_description = 'Numéro d’adhérent' 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 admin.site.unregister(User) admin.site.unregister(Group) admin.site.register(ProxyUser, UserAdmin) admin.site.register(Corporation, CorporationAdmin) admin.site.register(Adhesion, AdhesionAdmin)