123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- 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
|