Browse Source

Рефакторинг комментов.

Вынес операции в отдельный модуль.
master
Дмитрий 3 years ago
parent
commit
e208fb293e
  1. 14
      blog/comments/services.py
  2. 7
      blog/comments/views.py
  3. 10
      blog/posts/views.py

14
blog/comments/services.py

@ -0,0 +1,14 @@
import base64
def encode_nickname(nickname: str) -> bytes:
"""Кодирует nickname в base64."""
return base64.b64encode(bytes(nickname, "utf-8"))
def decode_nickname(encoded_nickname: str) -> str:
"""Декодирует base64, содержащийся в строке encoded_nickname. """
# пришлось отрезать кусок b из самой строки, потому что байты были
# всунуты в строку, и base64 не понимал
return base64.b64decode(encoded_nickname[1:]).decode()

7
blog/comments/views.py

@ -8,6 +8,7 @@ from django.db import IntegrityError
import hashlib import hashlib
from typing import Union from typing import Union
from . import services
def leave_comment(request, post_id): def leave_comment(request, post_id):
@ -36,7 +37,7 @@ def leave_comment(request, post_id):
# если секрет не совпал, то польозхватель Anonym # если секрет не совпал, то польозхватель Anonym
author = get_or_create_author(request.POST["name"], request.POST["secret"]) author = get_or_create_author(request.POST["name"], request.POST["secret"])
nickname = request.POST["name"] nickname = request.POST["name"].strip()
if not author: if not author:
post.comment_set.create( post.comment_set.create(
@ -52,7 +53,7 @@ def leave_comment(request, post_id):
reply=parent, reply=parent,
) )
response = HttpResponseRedirect(reverse("posts:detail", args=(post.id,))) response = HttpResponseRedirect(reverse("posts:detail", args=(post.id,)))
response.set_cookie("nickname", nickname, max_age=300) response.set_cookie("nickname", services.encode_nickname(nickname), max_age=300)
return response return response
@ -66,7 +67,7 @@ def get_or_create_author(name: str, secret: str) -> Union[CommentAuthor, None]:
try: try:
author, result = CommentAuthor.objects.get_or_create( author, result = CommentAuthor.objects.get_or_create(
author_name=name, author_secret_hash=hash author_name=name.strip(), author_secret_hash=hash
) )
except IntegrityError: except IntegrityError:
# если имя/хеш не совпадают, то игнорируем такого автора и отображаем ником # если имя/хеш не совпадают, то игнорируем такого автора и отображаем ником

10
blog/posts/views.py

@ -4,7 +4,7 @@ from django.http import HttpResponse
from .models import Post from .models import Post
from comments.models import Comment from comments.models import Comment
import re from comments import services as comments_services
def index(request): def index(request):
@ -16,12 +16,14 @@ def index(request):
def detail(request, post_id): def detail(request, post_id):
"""Страница с просмотром поста.""" """Страница с просмотром поста."""
# вынести отсюда все. Также надо обработать текст поста тут. # вынести отсюда все. Также надо обработать текст поста тут.
post = get_object_or_404(Post, pk=post_id) post = get_object_or_404(Post, pk=post_id)
comments = post.comment_set.all() comments = post.comment_set.all()
comments_count = comments.count() comments_count = comments.count()
nickname = (
request.COOKIES.get("nickname") if request.COOKIES.get("nickname") else "" _nickname = request.COOKIES.get("nickname")
) nickname = comments_services.decode_nickname(_nickname) if _nickname else ""
return render( return render(
request, request,
"posts/post.html", "posts/post.html",

Loading…
Cancel
Save