129 lines
4.2 KiB
Python
Raw Normal View History

2025-12-05 18:15:36 +01:00
import logging
from aiohttp import web
from snek.system.view import BaseView
from snek.system.exceptions import ValidationError, DuplicateResourceError
logger = logging.getLogger(__name__)
class ProfilePagesView(BaseView):
login_required = True
async def get(self):
pages = await self.services.profile_page.get_user_pages(
self.session.get("uid"),
include_unpublished=True
)
return await self.render_template(
"settings/profile_pages/index.html",
{"pages": pages}
)
class ProfilePageCreateView(BaseView):
login_required = True
async def get(self):
return await self.render_template("settings/profile_pages/create.html", {})
async def post(self):
data = await self.request.post()
title = data.get("title", "").strip()
content = data.get("content", "")
is_published = data.get("is_published") == "on"
if not title:
return await self.render_template(
"settings/profile_pages/create.html",
{"error": "Title is required"}
)
try:
await self.services.profile_page.create_page(
user_uid=self.session.get("uid"),
title=title,
content=content,
is_published=is_published
)
return web.HTTPFound("/settings/profile_pages/index.html")
except DuplicateResourceError as e:
return await self.render_template(
"settings/profile_pages/create.html",
{"error": str(e), "title": title, "content": content}
)
class ProfilePageEditView(BaseView):
login_required = True
async def get(self):
page_uid = self.request.match_info.get("page_uid")
page = await self.services.profile_page.get(uid=page_uid, deleted_at=None)
if not page or page["user_uid"] != self.session.get("uid"):
raise web.HTTPNotFound()
return await self.render_template(
"settings/profile_pages/edit.html",
{"page": page}
)
async def post(self):
page_uid = self.request.match_info.get("page_uid")
page = await self.services.profile_page.get(uid=page_uid, deleted_at=None)
if not page or page["user_uid"] != self.session.get("uid"):
raise web.HTTPNotFound()
data = await self.request.post()
title = data.get("title", "").strip()
content = data.get("content", "")
is_published = data.get("is_published") == "on"
if not title:
return await self.render_template(
"settings/profile_pages/edit.html",
{"page": page, "error": "Title is required"}
)
try:
await self.services.profile_page.update_page(
page_uid=page_uid,
title=title,
content=content,
is_published=is_published
)
return web.HTTPFound("/settings/profile_pages/index.html")
except DuplicateResourceError as e:
page["title"] = title
page["content"] = content
page["is_published"] = is_published
return await self.render_template(
"settings/profile_pages/edit.html",
{"page": page, "error": str(e)}
)
class ProfilePageDeleteView(BaseView):
login_required = True
async def post(self):
page_uid = self.request.match_info.get("page_uid")
page = await self.services.profile_page.get(uid=page_uid, deleted_at=None)
if not page or page["user_uid"] != self.session.get("uid"):
raise web.HTTPNotFound()
await self.services.profile_page.delete_page(page_uid)
return web.HTTPFound("/settings/profile_pages/index.html")
class ProfilePageReorderView(BaseView):
login_required = True
async def post(self):
data = await self.request.json()
page_uids = data.get("page_uids", [])
await self.services.profile_page.reorder_pages(
user_uid=self.session.get("uid"),
page_uids=page_uids
)
return web.json_response({"success": True})