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 AdhesionForm, UserCreationForm from .models import User, 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 def adherent_id(self, user): adherent = user.adhesion if adherent: return adherent.id adherent_id.short_description = 'Numéro d’adhérent' def get_form(self, request, obj=None, **kwargs): if obj: UserAdmin.inlines = (ProfileInline, AdhesionInline,) return super().get_form(request, obj, **kwargs) else: UserAdmin.inlines = (AdhesionInline,) return UserCreationForm def get_fieldsets(self, request, obj=None): if obj: 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'], }), ) else: return ( (None, { 'fields': ('first_name', 'last_name', 'username',), }), ) 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 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(AuthUser) admin.site.unregister(Group) admin.site.register(User, UserAdmin) admin.site.register(Corporation, CorporationAdmin) admin.site.register(Adhesion, AdhesionAdmin)