cheesy/moku/views/post.py

110 lines
3.7 KiB
Python
Raw Normal View History

import json
from django.conf import settings
2024-03-25 11:59:06 +00:00
from django.contrib import messages
2024-03-25 10:36:10 +00:00
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse
2024-03-25 10:36:10 +00:00
from django.shortcuts import redirect
2024-03-25 11:59:06 +00:00
from django.utils.translation import gettext as _
from django.views.generic import View as BaseView
2024-03-25 10:36:10 +00:00
from moku.constants import EMOJI_CATEGORIES, Verbs
from moku.forms.post import 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
class FeedView(FormView):
"""Allows users to see recent posts and create a new post."""
2024-03-25 10:36:10 +00:00
template_name = "moku/feed.jinja"
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-25 14:11:21 +00:00
if "image" in form.changed_data and form.instance.image is not None:
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,
"verbs": (
2024-03-26 12:18:47 +00:00
(
verb[0],
verb[1] % {"user": f"@{self.request.user.username}", "food": "..."},
)
2024-03-25 10:36:10 +00:00
for verb in Verbs.CHOICES
2024-03-26 12:18:47 +00:00
),
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
class LatestPostJSONView(BaseView):
"""Renders the latest post from a specific user as JSON."""
def get(self, request, *args, **kwargs):
2024-03-26 12:18:47 +00:00
post = (
Post.objects.prefetch_related("recipe__steps")
.filter(created_by__username=kwargs.get("username"))
.order_by("-created_at")
.first()
)
if not post:
2024-03-26 12:18:47 +00:00
return HttpResponse(
json.dumps({"post": None}), content_type="application/json"
)
post_data = {
"date": str(post.created_at),
2024-03-26 12:18:47 +00:00
"text": post.get_verb_display()
% {"user": f"@{post.created_by.username}", "food": post.food},
"food": post.food,
"verb": {
"id": post.verb,
"pattern": post.get_verb_display() % {"user": "$1", "food": "$2"},
},
2024-03-26 12:18:47 +00:00
"image": f"{settings.SITE_ROOT_URL}{post.image.url}"
if post.image
else None,
"user": {
"username": post.created_by.username,
"url": f"{settings.SITE_ROOT_URL}{post.created_by.get_absolute_url()}",
},
}
if post.recipe:
2024-03-26 12:18:47 +00:00
post_data["recipe"] = [
step.instructions for step in post.recipe.steps.all()
]
return HttpResponse(json.dumps(post_data), content_type="application/json")