from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.models import User from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.decorators import permission_required from django.views.generic import ListView, DetailView, CreateView, UpdateView from django.contrib.contenttypes.models import ContentType from django.contrib import messages from accounts.models import Profile from accounts.forms import UserCreateForm, UserChangeForm, ProfileForm from .models import Adhesion, Corporation from .forms import AdhesionForm @login_required def user(request): return render(request, 'adhesions/user.html', { 'adherent': request.user, 'adhesion': request.user.profile.adhesion, }) @login_required def corporation(request, pk): corporation = get_object_or_404(Corporation, pk=pk) try: corporation.members.get(pk=request.user.pk) except User.DoesNotExist: raise PermissionDenied return render(request, 'adhesions/corporation.html', { 'adherent': corporation, 'adhesion': corporation.adhesion, }) class UserMixin(PermissionRequiredMixin): model = User permission_required = 'auth.change_user' class UserList(UserMixin, ListView): template_name = 'adhesions/user_list.html' class UserDetail(UserMixin, DetailView): template_name = 'adhesions/user_detail.html' @permission_required('auth.change_user') def user_edit(request, pk=None): if pk: user = get_object_or_404(User, pk=pk) user_form = UserChangeForm(request.POST or None, instance=user) profile = user.profile else: user = None user_form = UserCreateForm(request.POST or None) profile = None profile_form = ProfileForm(request.POST or None, instance=profile) forms = [user_form, profile_form] if not pk or not user.profile.adhesion: adhesion_form = AdhesionForm(request.POST or None) forms += [adhesion_form] else: adhesion_form = None if request.method == 'POST' and all([form.is_valid() for form in forms]): error = False if user: # update user_form.save() profile_form.save() else: user = user_form.save() # profile created by user post_save signal profile = Profile.objects.get(user__pk=user.pk) profile_form = ProfileForm(request.POST, instance=profile) if profile_form.is_valid(): profile_form.save() else: # we need a new user form bind to user instance user_form = UserForm(request.POST or None, instance=user) forms[0] = user_form error = True if adhesion_form: if adhesion_form.is_valid(): if adhesion_form.cleaned_data['adherent']: Adhesion.objects.create( adherent_type=ContentType.objects.get_for_model(User), adherent_id=user.pk, ) # TODO: contribution else: error = True if not error: messages.success(request, 'Utilisateur créé avec succès.') return redirect('user-detail', pk=user.pk) messages.warn(request, 'Utilisateur créé mais certaines informations du profil ' 'n’ont pas été sauvegardé, veuillez les corriger.') return render(request, 'adhesions/user_form.html', { 'forms': forms, 'user': user, }) class CorporationMixin(PermissionRequiredMixin): model = Corporation permission_required = 'adhesions.change_corporation' class CorporationList(CorporationMixin, ListView): pass class CorporationDetail(CorporationMixin, DetailView): pass class CorporationCreate(CorporationMixin, CreateView): fields = ('social_reason',) class CorporationUpdate(CorporationMixin, UpdateView): fields = ('social_reason',) class AdhesionMixin(PermissionRequiredMixin): model = Adhesion permission_required = 'adhesions.change_adhesion' class AdhesionList(AdhesionMixin, ListView): pass class AdhesionDetail(AdhesionMixin, DetailView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['show_adherent'] = True return context