views.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. from django.contrib.auth.decorators import login_required
  2. from django.core.exceptions import PermissionDenied
  3. from django.shortcuts import render, redirect, get_object_or_404
  4. from django.contrib.auth.models import User
  5. from django.contrib.auth.mixins import PermissionRequiredMixin
  6. from django.contrib.auth.decorators import permission_required
  7. from django.views.generic import ListView, DetailView, CreateView, UpdateView
  8. from django.contrib.contenttypes.models import ContentType
  9. from django.contrib import messages
  10. from accounts.models import Profile
  11. from accounts.forms import UserCreateForm, UserChangeForm, ProfileForm
  12. from .models import Adhesion, Corporation
  13. from .forms import AdhesionForm
  14. @login_required
  15. def user(request):
  16. return render(request, 'adhesions/user.html', {
  17. 'adherent': request.user,
  18. 'adhesion': request.user.profile.adhesion,
  19. })
  20. @login_required
  21. def corporation(request, pk):
  22. corporation = get_object_or_404(Corporation, pk=pk)
  23. try:
  24. corporation.members.get(pk=request.user.pk)
  25. except User.DoesNotExist:
  26. raise PermissionDenied
  27. return render(request, 'adhesions/corporation.html', {
  28. 'adherent': corporation,
  29. 'adhesion': corporation.adhesion,
  30. })
  31. class UserMixin(PermissionRequiredMixin):
  32. model = User
  33. permission_required = 'auth.change_user'
  34. class UserList(UserMixin, ListView):
  35. template_name = 'adhesions/user_list.html'
  36. class UserDetail(UserMixin, DetailView):
  37. template_name = 'adhesions/user_detail.html'
  38. @permission_required('auth.change_user')
  39. def user_edit(request, pk=None):
  40. if pk:
  41. user = get_object_or_404(User, pk=pk)
  42. user_form = UserChangeForm(request.POST or None, instance=user)
  43. profile = user.profile
  44. else:
  45. user = None
  46. user_form = UserCreateForm(request.POST or None)
  47. profile = None
  48. profile_form = ProfileForm(request.POST or None, instance=profile)
  49. forms = [user_form, profile_form]
  50. if not pk or not user.profile.adhesion:
  51. adhesion_form = AdhesionForm(request.POST or None)
  52. forms += [adhesion_form]
  53. else:
  54. adhesion_form = None
  55. if request.method == 'POST' and all([form.is_valid() for form in forms]):
  56. error = False
  57. if user: # update
  58. user_form.save()
  59. profile_form.save()
  60. else:
  61. user = user_form.save()
  62. # profile created by user post_save signal
  63. profile = Profile.objects.get(user__pk=user.pk)
  64. profile_form = ProfileForm(request.POST, instance=profile)
  65. if profile_form.is_valid():
  66. profile_form.save()
  67. else:
  68. # we need a new user form bind to user instance
  69. user_form = UserForm(request.POST or None, instance=user)
  70. forms[0] = user_form
  71. error = True
  72. if adhesion_form:
  73. if adhesion_form.is_valid():
  74. if adhesion_form.cleaned_data['adherent']:
  75. Adhesion.objects.create(
  76. adherent_type=ContentType.objects.get_for_model(User),
  77. adherent_id=user.pk,
  78. )
  79. # TODO: contribution
  80. else:
  81. error = True
  82. if not error:
  83. messages.success(request, 'Utilisateur créé avec succès.')
  84. return redirect('user-detail', pk=user.pk)
  85. messages.warn(request, 'Utilisateur créé mais certaines informations du profil '
  86. 'n’ont pas été sauvegardé, veuillez les corriger.')
  87. return render(request, 'adhesions/user_form.html', {
  88. 'forms': forms,
  89. 'user': user,
  90. })
  91. class CorporationMixin(PermissionRequiredMixin):
  92. model = Corporation
  93. permission_required = 'adhesions.change_corporation'
  94. class CorporationList(CorporationMixin, ListView):
  95. pass
  96. class CorporationDetail(CorporationMixin, DetailView):
  97. pass
  98. class CorporationCreate(CorporationMixin, CreateView):
  99. fields = ('social_reason',)
  100. class CorporationUpdate(CorporationMixin, UpdateView):
  101. fields = ('social_reason',)
  102. class AdhesionMixin(PermissionRequiredMixin):
  103. model = Adhesion
  104. permission_required = 'adhesions.change_adhesion'
  105. class AdhesionList(AdhesionMixin, ListView):
  106. pass
  107. class AdhesionDetail(AdhesionMixin, DetailView):
  108. def get_context_data(self, **kwargs):
  109. context = super().get_context_data(**kwargs)
  110. context['show_adherent'] = True
  111. return context