feat: 🙋 improve data returned from user json endpoint
This commit is contained in:
parent
f5607a4680
commit
83ce6e887e
3 changed files with 64 additions and 50 deletions
|
|
@ -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/<str:username>", ProfileView.as_view(), name="profile"),
|
||||
path("user/<str:username>/json", LatestPostJSONView.as_view(), name="json"),
|
||||
path("user/<str:username>/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/<str:uuid>", ShowRecipeView.as_view(), name="recipe.show"),
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Reference in a new issue