123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- from django.shortcuts import render, get_object_or_404
- from django.http import HttpResponse, Http404
- from django.template import TemplateDoesNotExist
- from django.template.loader import get_template
- from django.contrib.auth.views import LoginView, LogoutView, PasswordChangeView
- from django.views.generic.edit import UpdateView, CreateView, DeleteView
- from django.contrib.messages.views import SuccessMessageMixin
- from django.urls import reverse_lazy
- from django.views.generic.base import TemplateView
- from django.core.signing import BadSignature
- from django.contrib.auth import logout
- from django.contrib.auth.decorators import login_required
- from django.contrib.auth.mixins import LoginRequiredMixin
- from django.contrib.messages.views import messages
- from .models import AdvUser
- from .forms import ChangeUserInfoForm, RegisterUserForm
- from .utilities import signer
- def index(request):
- """Отображение главной страницы"""
- return render(request, 'mainapp/index.html')
- def other_page(request, page):
- """Отображение других статических страниц"""
- try:
- template = get_template('mainapp/' + page + '.html')
- except TemplateDoesNotExist:
- raise Http404
- return HttpResponse(template.render(request=request))
- class AdvUserLoginView(LoginView):
- """Вход на сайт зарегистрированного пользователя - login"""
- template_name = 'mainapp/login.html'
- def post(self, request, *args, **kwargs):
- """
- Переопределяем метод POST в этом классе
- """
- form = self.get_form()
- if form.is_valid():
- return self.form_valid(form)
- else:
- # Сохраняем никнейм юзера, который стучится к нам в POST запросе
- form_user = request.POST.__getitem__('username')
- # Выбираем и сохраняем в список ники всех юзеров, которые у нас зарегистрированы
- # (в тч и неактивных)
- username_nic = []
- users = AdvUser.objects.all()
- for user in users:
- username_nic.append(user.username)
- if (str(form_user) in username_nic):
- # Проверяем, если пользователь зарегистрировался, подтвердил мейл,
- # но ещё не активирован админом, шлём ему второе зелёное сообщение
- messages.add_message(
- request,
- messages.SUCCESS,
- 'Уважаемый, ' + str(form_user) + ', пожалуйста дождитесь активации аккаунта администратором сайта')
- return self.form_invalid(form)
- @login_required
- def profile(request):
- """Контроллер страницы пользовательского профиля"""
- context = {'example': 'test'}
- #MY-TODO Контекст отдаем пока в шаблон просто для примера!!!
- return render(request, 'mainapp/profile.html', context)
- class AdvUserLogoutView(LoginRequiredMixin, LogoutView):
- """Выход (разлогинивание) пользователя"""
- template_name = 'mainapp/logout.html'
- class ChangeUserInfoView(SuccessMessageMixin, LoginRequiredMixin, UpdateView):
- model = AdvUser
- template_name = 'mainapp/change_user_info.html'
- form_class = ChangeUserInfoForm
- success_url = reverse_lazy('mainapp:profile')
- success_message = 'Личные данные пользователя изменены'
- def dispatch(self, request, *args, **kwargs):
- self.user_id = request.user.pk
- return super().dispatch(request, *args, **kwargs)
- def get_object(self, queryset=None):
- if not queryset:
- queryset = self.get_queryset()
- return get_object_or_404(queryset, pk=self.user_id)
- class AdvUserPasswordChangeView(SuccessMessageMixin, LoginRequiredMixin, PasswordChangeView):
- """Контроллер мы делаем на основе контроллера-класса
- PasswordChangeView, который реализует смену пароля."""
- template_name = 'mainapp/password_change.html'
- success_url = reverse_lazy('main:profile')
- success_message = 'Пароль пользователя изменен'
- class RegisterUserView(CreateView):
- """Контроллер-класс, регистрирующий пользователя"""
- model = AdvUser
- template_name = 'mainapp/register_user.html'
- form_class = RegisterUserForm
- success_url = reverse_lazy('mainapp:register_done')
- class RegisterDoneView(TemplateView):
- """Контроллер, который выведет сообщение об успешной регистрации"""
- template_name = 'mainapp/register_done.html'
- def user_activate(request, sign):
- """Функция, обрабатывающая полученное подтверждение активации юзера на сайте"""
- try:
- username = signer.unsign(sign)
- except BadSignature:
- # Подпись не соответствует!!!
- return render(request, 'mainapp/bad_signature.html')
- user = get_object_or_404(AdvUser, username=username)
- if user.is_activated:
- # Пользователь с таким именем был активирован ранее
- template = 'mainapp/user_is_activated.html'
- else:
- # Пользователь с таким именем успешно активирован
- template = 'mainapp/activation_done.html'
- # И всёже оставим за админом право окончательно активировать пользователя
- user.is_active = False
- # Пользователь прошел регистрацию и подтвердил адрес электронной почты
- user.is_activated = True
- user.save()
- return render(request, template)
- class DeleteUserView(LoginRequiredMixin, DeleteView):
- """Контроллер-класс DeleteUserView, выполняющий удаление текущего пользователя"""
- #MY-TODO Вот только нужно ли это? Может просто деактивировать?
- model = AdvUser
- template_name = 'mainapp/delete_user.html'
- success_url = reverse_lazy('mainapp:index')
- def dispatch(self, request, *args, **kwargs):
- self.user_id = request.user.pk
- return super().dispatch(request, *args, **kwargs)
- def post(self, request, *args, **kwargs):
- logout(request)
- messages.add_message(request, messages.SUCCESS,
- 'Пользователь удалён')
- return super().post(request, *args, **kwargs)
- def get_object(self, queryset=None):
- if not queryset:
- queryset = self.get_queryset()
- return get_object_or_404(queryset, pk=self.user_id)
|