cross-posting/cms/views.py

72 lines
2.7 KiB
Python

from django.contrib import messages
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpRequest, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from django.views import View
from cms import promoters
from cms.forms import ArticleForm, UserForm
from cms.models import Article
class ArticleView(LoginRequiredMixin, View):
def post(self, request: HttpRequest):
post_data = request.POST
article = Article.objects.create(body=post_data['body'],
link=post_data['link'])
marketer = promoters.Marketer(article)
try:
marketer.promote()
message_type = messages.SUCCESS
message_text = 'Продвижение статьи прошло успешно'
except promoters.PromoteError as exc:
message_type = messages.ERROR
message_text = 'Произошла ошибка: %s' % str(exc)
messages.add_message(request=request,
level=message_type,
message=message_text)
return HttpResponseRedirect(reverse('new-article'))
@login_required
def new_article(request):
article_form = ArticleForm()
article_context = {
'new_article_form': article_form
}
return render(request,
template_name='articles/new.html',
context=article_context)
class AuthenticationView(View):
def get(self, request, *args, **kwargs):
user_form = UserForm()
auth_context = {
'user_form': user_form,
}
return render(request,
'user/sign_in.html',
context=auth_context)
def post(self, request, *args, **kwargs):
username = request.POST['username']
password = request.POST['password']
authenticated_user = authenticate(username=username,
password=password)
if authenticated_user is None:
messages.add_message(request,
messages.ERROR,
'Неправильное имя пользователя и/или пароль')
return HttpResponseRedirect(reverse('authenticate'))
else:
messages.add_message(request,
messages.SUCCESS,
'Поздравляю, вы вошли успешно')
login(request,
user=authenticated_user)
return HttpResponseRedirect(reverse('new-article'))