views.py 4.5 KB

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