views.py 4.5 KB

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