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 banking.forms import PaymentForm 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