From 83ce6e887e928b1408ebfe57f95f179188d50bc8 Mon Sep 17 00:00:00 2001 From: m5ka Date: Wed, 27 Mar 2024 10:26:08 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=99=8B=20improve=20data=20returne?= =?UTF-8?q?d=20from=20user=20json=20endpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- moku/config/urls.py | 12 +++++++--- moku/views/post.py | 47 -------------------------------------- moku/views/user.py | 55 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 50 deletions(-) diff --git a/moku/config/urls.py b/moku/config/urls.py index 34857a5..74d08ac 100644 --- a/moku/config/urls.py +++ b/moku/config/urls.py @@ -4,7 +4,7 @@ from django.contrib import admin from django.urls import include, path from moku.views.auth import LoginView, LogoutView -from moku.views.post import FeedView, LatestPostJSONView +from moku.views.post import FeedView from moku.views.recipe import ( DeleteRecipeView, DeleteStepView, @@ -14,7 +14,13 @@ from moku.views.recipe import ( ShowRecipeView, ) from moku.views.static import ChangelogView, PrivacyView, TermsView -from moku.views.user import EditProfileView, EditSettingsView, ProfileView, SignupView +from moku.views.user import ( + EditProfileView, + EditSettingsView, + ProfileView, + SignupView, + UserJSONView, +) urlpatterns = [ path("admin/", admin.site.urls), @@ -28,7 +34,7 @@ urlpatterns = [ path("privacy", PrivacyView.as_view(), name="privacy"), path("terms", TermsView.as_view(), name="terms"), path("user/", ProfileView.as_view(), name="profile"), - path("user//json", LatestPostJSONView.as_view(), name="json"), + path("user//json", UserJSONView.as_view(), name="json"), path("recipes", IndexRecipeView.as_view(), name="recipe.index"), path("recipes/new", NewRecipeView.as_view(), name="recipe.new"), path("recipes/", ShowRecipeView.as_view(), name="recipe.show"), diff --git a/moku/views/post.py b/moku/views/post.py index efac7ab..cb65465 100644 --- a/moku/views/post.py +++ b/moku/views/post.py @@ -1,13 +1,7 @@ -import json - -from django.conf import settings from django.contrib import messages -from django.contrib.humanize.templatetags.humanize import naturaltime from django.core.exceptions import PermissionDenied -from django.http import HttpResponse from django.shortcuts import redirect from django.utils.translation import gettext as _ -from django.views.generic import View as BaseView from moku.constants import EMOJI_CATEGORIES, Verbs from moku.forms.post import PostForm @@ -70,44 +64,3 @@ class FeedView(FormView): 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): - post = ( - Post.objects.prefetch_related("recipe__steps") - .filter(created_by__username=kwargs.get("username")) - .order_by("-created_at") - .first() - ) - if not post: - return HttpResponse( - json.dumps({"post": None}), content_type="application/json" - ) - post_data = { - "date": { - "iso": str(post.created_at), - "natural": naturaltime(post.created_at), - }, - "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"}, - }, - "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: - post_data["recipe"] = [ - step.instructions for step in post.recipe.steps.all() - ] - return HttpResponse(json.dumps(post_data), content_type="application/json") diff --git a/moku/views/user.py b/moku/views/user.py index 85943bc..557c29b 100644 --- a/moku/views/user.py +++ b/moku/views/user.py @@ -1,13 +1,20 @@ +import json + +from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.humanize.templatetags.humanize import naturaltime from django.db import IntegrityError +from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect from django.utils.functional import cached_property from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy as gettext_lazy +from django.views.generic import View as BaseView from moku.forms.user import ProfileForm, UserForm, UserSettingsForm from moku.images import process_avatar_image +from moku.models.post import Post from moku.models.user import User from moku.views.base import FormView, View @@ -103,3 +110,51 @@ class SignupView(FormView): if self.request.user.is_authenticated: return redirect("feed") return super().get(request, *args, **kwargs) + + +class UserJSONView(BaseView): + """ + Renders information about a specific user as JSON, including their latest post. + """ + + def get(self, request, *args, **kwargs): + user = get_object_or_404(User, username=kwargs.get("username")) + post = ( + Post.objects.prefetch_related("recipe__steps") + .filter(created_by=user) + .order_by("-created_at") + .first() + ) + if not post: + post_data = None + else: + post_data = { + "date": { + "iso": str(post.created_at), + "natural": naturaltime(post.created_at), + }, + "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"}, + }, + "image": f"{settings.SITE_ROOT_URL}{post.image.url}" + if post.image + else None, + "recipe": [step.instructions for step in post.recipe.steps.all()] + if post.recipe + else None, + } + user_data = { + "user": { + "username": user.username, + "avatar": f"{settings.SITE_ROOT_URL}{user.avatar.url}" + if user.avatar + else None, + "url": f"{settings.SITE_ROOT_URL}{user.get_absolute_url()}", + "latest_post": post_data, + } + } + return HttpResponse(json.dumps(user_data), content_type="application/json")