cheesy/moku/views/post.py

146 lines
4.9 KiB
Python
Raw Normal View History

2024-03-25 11:59:06 +00:00
from django.contrib import messages
2024-03-27 15:43:24 +00:00
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
2024-03-27 16:19:10 +00:00
from django.contrib.humanize.templatetags.humanize import naturaltime
2024-03-25 10:36:10 +00:00
from django.core.exceptions import PermissionDenied
2024-03-27 15:43:24 +00:00
from django.shortcuts import get_object_or_404, redirect
2024-03-27 16:19:10 +00:00
from django.urls import reverse
2024-03-27 15:43:24 +00:00
from django.utils.functional import cached_property
2024-03-25 11:59:06 +00:00
from django.utils.translation import gettext as _
2024-03-25 10:36:10 +00:00
from moku.constants import EMOJI_CATEGORIES, Verbs
2024-03-27 16:19:10 +00:00
from moku.forms.post import DeletePostForm, PostForm
2024-03-25 14:11:21 +00:00
from moku.images import process_post_image
2024-03-25 10:36:10 +00:00
from moku.models.post import Post
from moku.models.recipe import Recipe
from moku.views.base import FormView
2024-03-25 10:36:10 +00:00
2024-03-27 15:43:24 +00:00
def _get_verbs(username):
return (
(verb[0], verb[1] % {"user": f"@{username}", "food": "..."})
for verb in Verbs.CHOICES
)
2024-03-27 16:19:10 +00:00
class DeletePostView(LoginRequiredMixin, UserPassesTestMixin, FormView):
"""Allows users to delete their previous posts."""
template_name = "moku/delete.jinja"
form_class = DeletePostForm
def form_valid(self, form):
self.post_object.delete()
messages.success(self.request, _("post deleted successfully!"))
return redirect("feed")
def get_context_data(self, **kwargs):
return {
**super().get_context_data(**kwargs),
"item": _("%(post_text)s from %(time_ago)s")
% {
2024-03-27 16:19:10 +00:00
"post_text": self.post_object.plain_text,
"time_ago": naturaltime(self.post_object.created_at),
},
"back_url": reverse("post.edit", kwargs={"uuid": self.post_object.uuid}),
}
@cached_property
def post_object(self):
return get_object_or_404(Post, uuid=self.kwargs.get("uuid"))
def test_func(self):
return self.request.user.id == self.post_object.created_by.id
2024-03-27 15:43:24 +00:00
class EditPostview(LoginRequiredMixin, UserPassesTestMixin, FormView):
"""Allows users to edit their previous posts."""
template_name = "moku/post/edit.jinja"
form_class = PostForm
def form_valid(self, form):
if (
form.instance.recipe
and form.instance.recipe.created_by.id != self.request.user.id
):
messages.error(
self.request, _("you can't add someone else's recipe to your post!")
)
return self.form_invalid(form)
if "image" in form.changed_data and form.instance.image.name:
form.instance.image = process_post_image(form.instance.image)
form.save()
messages.success(self.request, _("your post was updated!"))
return redirect("feed")
def get_context_data(self, **kwargs):
return {
**super().get_context_data(**kwargs),
"post": self.post_object,
"verbs": _get_verbs(self.request.user.username),
"emoji": EMOJI_CATEGORIES,
}
def get_form(self):
form = self.form_class(instance=self.post_object, **self.get_form_kwargs())
form.fields["recipe"].queryset = Recipe.objects.filter(
created_by=self.request.user
)
return form
2024-03-27 15:43:24 +00:00
@cached_property
def post_object(self):
return get_object_or_404(Post, uuid=self.kwargs.get("uuid"))
def test_func(self):
return self.post_object.created_by.id == self.request.user.id
2024-03-25 10:36:10 +00:00
class FeedView(FormView):
"""Allows users to see recent posts and create a new post."""
2024-03-27 15:43:24 +00:00
template_name = "moku/post/index.jinja"
2024-03-25 10:36:10 +00:00
form_class = PostForm
def form_valid(self, form):
if not self.request.user.is_authenticated:
raise PermissionDenied
2024-03-26 12:18:47 +00:00
if (
form.instance.recipe
and form.instance.recipe.created_by.id != self.request.user.id
):
messages.error(
self.request, _("you can't add someone else's recipe to your post!")
)
return redirect("feed")
2024-03-25 10:36:10 +00:00
form.instance.created_by = self.request.user
2024-03-27 15:43:24 +00:00
if "image" in form.changed_data and form.instance.image.name:
2024-03-25 14:11:21 +00:00
form.instance.image = process_post_image(form.instance.image)
2024-03-25 11:59:06 +00:00
form.save()
messages.success(self.request, _("your post was made!"))
2024-03-25 10:36:10 +00:00
return redirect("feed")
def get_context_data(self, **kwargs):
context = {
**super().get_context_data(**kwargs),
2024-03-26 12:18:47 +00:00
"posts": Post.objects.all()[:128],
2024-03-25 10:36:10 +00:00
}
if self.request.user.is_authenticated:
return self.get_authenticated_context_data(context)
return context
def get_authenticated_context_data(self, context):
return {
**context,
"emoji": EMOJI_CATEGORIES,
2024-03-27 15:43:24 +00:00
"verbs": _get_verbs(self.request.user.username),
2024-03-25 10:36:10 +00:00
}
def get_form(self, form_class=None):
form = super().get_form(form_class)
if self.request.user.is_authenticated:
2024-03-26 12:18:47 +00:00
form.fields["recipe"].queryset = Recipe.objects.filter(
created_by=self.request.user
)
return form