from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from django.db.models.query import QuerySet
from .models import Post
from comments.models import Comment
from django.core.paginator import Paginator
from blog.settings import ITEMS_PER_PAGE
from comments import services as comments_services
import re
from re import Match
def index(request, page: int = 1):
"""Список постов."""
post_list = Post.objects.order_by("-pub_date")[:ITEMS_PER_PAGE]
paginator = Paginator(Post.objects.order_by("-pub_date"), ITEMS_PER_PAGE)
if page > paginator.num_pages:
page = paginator.num_pages
if page < 1:
page = 1
posts = paginator.get_page(page)
return render(
request,
"posts/index.html",
{"posts": posts, "paginator": paginator, "current_page": page},
)
def image_processing(match: Match, images: QuerySet) -> str:
"""Заменяет строку с шорткодом [[image:slug]] на валидный HTML тег.
Из match берется slug картинки, по которому потом выбираем из
images ее url. Если объекта с таким slug нет (IndexError), то заменяем шорткод
картинки на пустую строку."""
sl = match.group(1)
try:
url = images.filter(slug=sl)[0].image.url
replacement = f""
except IndexError:
replacement = ""
return replacement
def detail(request, post_id):
"""Страница с просмотром поста."""
# вынести отсюда все. Также надо обработать текст поста тут.
post = get_object_or_404(Post, pk=post_id)
comments = post.comment_set.all()
comments_count = comments.count()
_nickname = request.COOKIES.get("nickname")
nickname = comments_services.decode_nickname(_nickname) if _nickname else ""
images = post.image_set.all()
# вывод картинок в посте, замена шаблона по регулярке
post.text = re.sub(
r"\[\[image\:(.+?)\]\]",
lambda x: image_processing(x, images),
post.text,
)
return render(
request,
"posts/post.html",
{
"post": post,
"comments": comments,
"comments_count": comments_count,
"nickname": nickname,
},
)