Add single page

This commit is contained in:
Andros Fenollosa 2021-11-13 09:07:55 +01:00
parent b8b101b466
commit 209adf66f7
6 changed files with 98 additions and 42 deletions

3
TODO
View File

@ -1,3 +1,4 @@
- Single talk. - Component link with scroll up
- Search
- List profiles - List profiles
- Chat - Chat

View File

@ -1,12 +1,12 @@
import json import json
from channels.generic.websocket import AsyncWebsocketConsumer from channels.generic.websocket import AsyncWebsocketConsumer
from asgiref.sync import sync_to_async from asgiref.sync import sync_to_async
from .views import page_talks, page_about from .views import page_talks, page_about, page_single_talk
class WebsiteConsumer(AsyncWebsocketConsumer): class WebsiteConsumer(AsyncWebsocketConsumer):
async def connect(self): async def connect(self):
'''Connect user''' """Connect user"""
self.room_name = self.scope["url_route"]["kwargs"]["room_id"] self.room_name = self.scope["url_route"]["kwargs"]["room_id"]
self.room_group_name = "root_%s" % self.room_name self.room_group_name = "root_%s" % self.room_name
@ -22,11 +22,11 @@ class WebsiteConsumer(AsyncWebsocketConsumer):
{ {
"type": "send_page_talks", "type": "send_page_talks",
"page": 1, "page": 1,
} },
) )
async def disconnect(self, close_code): async def disconnect(self, close_code):
''' Cliente se desconecta ''' """Cliente se desconecta"""
# Leave room group # Leave room group
await self.channel_layer.group_discard(self.room_group_name, self.channel_name) await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
@ -45,15 +45,20 @@ class WebsiteConsumer(AsyncWebsocketConsumer):
{ {
"type": "send_page_talks", "type": "send_page_talks",
"page": page, "page": page,
},
)
# Single talk
if data["value"] == "single-talk":
await self.channel_layer.group_send(
self.room_group_name, {
"type": "send_page_single_talk",
"id": data["id"],
} }
) )
# About # About
if data["value"] == "about": if data["value"] == "about":
await self.channel_layer.group_send( await self.channel_layer.group_send(
self.room_group_name, self.room_group_name, {"type": "send_page_about"}
{
"type": "send_page_about"
}
) )
# Pages # Pages
@ -62,14 +67,22 @@ class WebsiteConsumer(AsyncWebsocketConsumer):
return page_talks(page=page) return page_talks(page=page)
async def send_page_talks(self, event): async def send_page_talks(self, event):
''' Send Home page ''' """Send Home page"""
html = await sync_to_async(self._get_talks)(event["page"]) html = await sync_to_async(self._get_talks)(event["page"])
await self.send(text_data=html) await self.send(text_data=html)
def _get_single_talk(self, id):
return page_single_talk(id)
async def send_page_single_talk(self, event):
"""Send Single talk page"""
html = await sync_to_async(self._get_single_talk)(event["id"])
await self.send(text_data=html)
def _get_about(self): def _get_about(self):
return page_about() return page_about()
async def send_page_about(self, event): async def send_page_about(self, event):
''' Send About page ''' """Send About page"""
html = await sync_to_async(self._get_about)() html = await sync_to_async(self._get_about)()
await self.send(text_data=html) await self.send(text_data=html)

View File

@ -3,5 +3,5 @@ from django.urls import re_path
from . import consumers from . import consumers
websocket_urlpatterns = [ websocket_urlpatterns = [
re_path(r'ws/pages/(?P<room_id>\w+)/$', consumers.WebsiteConsumer), re_path(r"ws/pages/(?P<room_id>\w+)/$", consumers.WebsiteConsumer),
] ]

View File

@ -0,0 +1,22 @@
<main id="main">
<article>
<header>
<p>
<img width="200" src="{{ talk.image.url }}">
</p>
<h2>{{ talk.title }}</h2>
</header>
<p>
{{ talk.content }}
</p>
<footer>Author {{ talk.author.full_name }} - {{ talk.category.name }}</footer>
</article>
<p>
<form>
<input type="hidden" name="action" value="page">
<input type="hidden" name="value" value="talks">
<input type="hidden" name="page" value="1">
<a href="#" hx-ws="send" hx-trigger="click">Back</a>
</form>
</p>
</main>

View File

@ -1,21 +1,26 @@
<main id="main"> <main id="main">
{% for talk in talks %} {% for talk in talks %}
<a href="#"> <form>
<article> <input type="hidden" name="action" value="page">
<header> <input type="hidden" name="value" value="single-talk">
<div class="grid"> <input type="hidden" name="id" value="{{ talk.id }}">
<p> <a href="#" hx-ws="send" hx-trigger="click">
<img width="200" src="{{ talk.image.url }}"> <article>
</p> <header>
<h2>{{ talk.title }}</h2> <div class="grid">
</div> <p>
</header> <img width="200" src="{{ talk.image.url }}">
<p> </p>
{{ talk.content|truncatechars:150 }} <h2>{{ talk.title }}</h2>
</p> </div>
<footer>Author {{ talk.author.full_name }} - {{ talk.category.name }}</footer> </header>
</article> <p>
</a> {{ talk.content|truncatechars:150 }}
</p>
<footer>Author {{ talk.author.full_name }} - {{ talk.category.name }}</footer>
</article>
</a>
</form>
{% endfor %} {% endfor %}
{# Pagination #} {# Pagination #}
<div class="loading" > <div class="loading" >

View File

@ -8,20 +8,35 @@ from asgiref.sync import sync_to_async
def index(request): def index(request):
"""Render layout page""" """Render layout page"""
return render(request, "layouts/base.html", { return render(
"room_random": randint(1000000, 9999999), request,
"DOMAIN": settings.DOMAIN, "layouts/base.html",
}) {
"room_random": randint(1000000, 9999999),
"DOMAIN": settings.DOMAIN,
},
)
def page_talks(page=1): def page_talks(page=1):
TALK_PER_PAGE = 5 TALK_PER_PAGE = 5
return render_to_string("pages/talks.html", return render_to_string(
{ "pages/talks.html",
"talks": Talk.objects.order_by("title")[:TALK_PER_PAGE * page], {
"page": page, "talks": Talk.objects.order_by("title")[: TALK_PER_PAGE * page],
"next_page": page + 1, "page": page,
}) "next_page": page + 1,
},
)
def page_single_talk(id):
return render_to_string(
"pages/talk-single.html",
{
"talk": Talk.objects.get(id=id),
},
)
def page_about(): def page_about():