views.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. from django.shortcuts import render, get_object_or_404
  2. from django.http import HttpResponse, Http404
  3. from django.template import TemplateDoesNotExist
  4. from django.template.loader import get_template
  5. from django.contrib.auth.views import LoginView, LogoutView, PasswordChangeView
  6. from django.views.generic.edit import UpdateView, CreateView, DeleteView
  7. from django.contrib.messages.views import SuccessMessageMixin
  8. from django.urls import reverse_lazy
  9. from django.views.generic.base import TemplateView
  10. from django.core.signing import BadSignature
  11. from django.contrib.auth import logout
  12. from django.contrib.auth.decorators import login_required
  13. from django.contrib.auth.mixins import LoginRequiredMixin
  14. from django.contrib.messages.views import messages
  15. from .models import AdvUser
  16. from .forms import ChangeUserInfoForm, RegisterUserForm
  17. from .utilities import signer
  18. def index(request):
  19. """Отображение главной страницы"""
  20. return render(request, 'mainapp/index.html')
  21. def other_page(request, page):
  22. """Отображение других статических страниц"""
  23. try:
  24. template = get_template('mainapp/' + page + '.html')
  25. except TemplateDoesNotExist:
  26. raise Http404
  27. return HttpResponse(template.render(request=request))
  28. class AdvUserLoginView(LoginView):
  29. """Вход на сайт зарегистрированного пользователя - login"""
  30. template_name = 'mainapp/login.html'
  31. def post(self, request, *args, **kwargs):
  32. """
  33. Переопределяем метод POST в этом классе
  34. """
  35. form = self.get_form()
  36. if form.is_valid():
  37. return self.form_valid(form)
  38. else:
  39. # Сохраняем никнейм юзера, который стучится к нам в POST запросе
  40. form_user = request.POST.__getitem__('username')
  41. # Выбираем и сохраняем в список ники всех юзеров, которые у нас зарегистрированы
  42. # (в тч и неактивных)
  43. username_nic = []
  44. users = AdvUser.objects.all()
  45. for user in users:
  46. username_nic.append(user.username)
  47. if (str(form_user) in username_nic):
  48. # Проверяем, если пользователь зарегистрировался, подтвердил мейл,
  49. # но ещё не активирован админом, шлём ему второе зелёное сообщение
  50. messages.add_message(
  51. request,
  52. messages.SUCCESS,
  53. 'Уважаемый, ' + str(form_user) + ', пожалуйста дождитесь активации аккаунта администратором сайта')
  54. return self.form_invalid(form)
  55. @login_required
  56. def profile(request):
  57. """Контроллер страницы пользовательского профиля"""
  58. context = {'example': 'test'}
  59. #MY-TODO Контекст отдаем пока в шаблон просто для примера!!!
  60. return render(request, 'mainapp/profile.html', context)
  61. class AdvUserLogoutView(LoginRequiredMixin, LogoutView):
  62. """Выход (разлогинивание) пользователя"""
  63. template_name = 'mainapp/logout.html'
  64. class ChangeUserInfoView(SuccessMessageMixin, LoginRequiredMixin, UpdateView):
  65. model = AdvUser
  66. template_name = 'mainapp/change_user_info.html'
  67. form_class = ChangeUserInfoForm
  68. success_url = reverse_lazy('mainapp:profile')
  69. success_message = 'Личные данные пользователя изменены'
  70. def dispatch(self, request, *args, **kwargs):
  71. self.user_id = request.user.pk
  72. return super().dispatch(request, *args, **kwargs)
  73. def get_object(self, queryset=None):
  74. if not queryset:
  75. queryset = self.get_queryset()
  76. return get_object_or_404(queryset, pk=self.user_id)
  77. class AdvUserPasswordChangeView(SuccessMessageMixin, LoginRequiredMixin, PasswordChangeView):
  78. """Контроллер мы делаем на основе контроллера-класса
  79. PasswordChangeView, который реализует смену пароля."""
  80. template_name = 'mainapp/password_change.html'
  81. success_url = reverse_lazy('main:profile')
  82. success_message = 'Пароль пользователя изменен'
  83. class RegisterUserView(CreateView):
  84. """Контроллер-класс, регистрирующий пользователя"""
  85. model = AdvUser
  86. template_name = 'mainapp/register_user.html'
  87. form_class = RegisterUserForm
  88. success_url = reverse_lazy('mainapp:register_done')
  89. class RegisterDoneView(TemplateView):
  90. """Контроллер, который выведет сообщение об успешной регистрации"""
  91. template_name = 'mainapp/register_done.html'
  92. def user_activate(request, sign):
  93. """Функция, обрабатывающая полученное подтверждение активации юзера на сайте"""
  94. try:
  95. username = signer.unsign(sign)
  96. except BadSignature:
  97. # Подпись не соответствует!!!
  98. return render(request, 'mainapp/bad_signature.html')
  99. user = get_object_or_404(AdvUser, username=username)
  100. if user.is_activated:
  101. # Пользователь с таким именем был активирован ранее
  102. template = 'mainapp/user_is_activated.html'
  103. else:
  104. # Пользователь с таким именем успешно активирован
  105. template = 'mainapp/activation_done.html'
  106. # И всёже оставим за админом право окончательно активировать пользователя
  107. user.is_active = False
  108. # Пользователь прошел регистрацию и подтвердил адрес электронной почты
  109. user.is_activated = True
  110. user.save()
  111. return render(request, template)
  112. class DeleteUserView(LoginRequiredMixin, DeleteView):
  113. """Контроллер-класс DeleteUserView, выполняющий удаление текущего пользователя"""
  114. #MY-TODO Вот только нужно ли это? Может просто деактивировать?
  115. model = AdvUser
  116. template_name = 'mainapp/delete_user.html'
  117. success_url = reverse_lazy('mainapp:index')
  118. def dispatch(self, request, *args, **kwargs):
  119. self.user_id = request.user.pk
  120. return super().dispatch(request, *args, **kwargs)
  121. def post(self, request, *args, **kwargs):
  122. logout(request)
  123. messages.add_message(request, messages.SUCCESS,
  124. 'Пользователь удалён')
  125. return super().post(request, *args, **kwargs)
  126. def get_object(self, queryset=None):
  127. if not queryset:
  128. queryset = self.get_queryset()
  129. return get_object_or_404(queryset, pk=self.user_id)