Initial commit

This commit is contained in:
marc
2025-03-09 20:00:54 +01:00
commit efd26ce19d
118 changed files with 78086 additions and 0 deletions

View File

View File

@@ -0,0 +1,45 @@
from fastapi import Request
from folkugat_web.model import sessions as model
from folkugat_web.services import sessions as service
from folkugat_web.templates import templates
def sessio_en_directe(request: Request):
session = service.get_live_session()
return templates.TemplateResponse(
"fragments/marquee.html",
{
"request": request,
"session": session,
}
)
def start_live_session(request: Request, session_id: int):
service.set_live_session(session_id=session_id)
session = model.Session(id=session_id)
return templates.TemplateResponse(
"fragments/sessions/live/stop.html",
{
"request": request,
"session": session,
},
headers={
"HX-Trigger": "reload-marquee"
}
)
def stop_live_session(request: Request, session_id: int):
service.stop_live_sessions()
session = model.Session(id=session_id)
return templates.TemplateResponse(
"fragments/sessions/live/start.html",
{
"request": request,
"session": session,
},
headers={
"HX-Trigger": "reload-marquee"
}
)

View File

@@ -0,0 +1,35 @@
from folkugat_web.config import nota as config
from folkugat_web.templates import templates
def input(request, value=None):
return templates.TemplateResponse(
"fragments/nota/input.html",
{
"request": request,
"value": value,
}
)
def footer(request, value, logged_in):
response = templates.TemplateResponse(
"fragments/nota/footer.html",
{
"request": request,
"value": config.LOGGED_IN_FOOTER if logged_in else value,
"logged_in": logged_in,
}
)
return response
def nota(request):
response = templates.TemplateResponse(
"fragments/nota/nota.html",
{
"request": request,
}
)
response.headers["HX-Refresh"] = "true"
return response

View File

@@ -0,0 +1,144 @@
from typing import Optional
from fastapi import Request
from fastapi.responses import HTMLResponse
from folkugat_web.config import calendari as config
from folkugat_web.model import sessions as model
from folkugat_web.model.pagines import Pages
from folkugat_web.services import sessions as service
from folkugat_web.templates import templates
def sessions_pagina(request, logged_in):
return templates.TemplateResponse(
"fragments/sessions/pagina.html",
{
"request": request,
"logged_in": logged_in,
"Pages": Pages,
"menu_selected_id": Pages.Sessions,
"calendar_list_id": config.CALENDAR_LIST_ID,
"history_list_id": config.HISTORY_LIST_ID,
}
)
def sessions_calendari(request: Request, limit: int, logged_in: bool):
sessions = service.get_next_sessions(limit=limit+1)
has_more_sessions = len(sessions) > limit
sessions = sessions[:limit]
next_session_id = sessions[0].id if sessions else None
return _sessions_list(
request=request,
sessions=sessions,
has_more_sessions=has_more_sessions,
paging_config=config.CALENDARI_PAGING_CONFIG,
list_id=config.CALENDAR_LIST_ID,
next_session_id=next_session_id,
get_sessions_url="/api/sessions/upcoming",
limit=limit,
logged_in=logged_in
)
def sessions_historial(request: Request, limit: int, logged_in: bool):
sessions = service.get_sessions_history(limit=limit+1)
has_more_sessions = len(sessions) > limit
sessions = sessions[:limit]
return _sessions_list(
request=request,
sessions=sessions,
has_more_sessions=has_more_sessions,
paging_config=config.HISTORY_PAGING_CONFIG,
list_id=config.HISTORY_LIST_ID,
get_sessions_url="/api/sessions/history",
limit=limit,
logged_in=logged_in
)
def _sessions_list(request: Request, sessions: list[model.Session], has_more_sessions: bool,
paging_config: config.PagingConfig, list_id: str, get_sessions_url: str,
limit: int, logged_in: bool, next_session_id: Optional[int] = None):
if has_more_sessions:
more_sessions = limit + paging_config.step
else:
more_sessions = None
if len(sessions) > paging_config.initial_items:
less_sessions = max(paging_config.initial_items, len(sessions) - paging_config.step)
else:
less_sessions = None
return templates.TemplateResponse(
"fragments/sessions/session_list.html",
{
"request": request,
"logged_in": logged_in,
"get_sessions_url": get_sessions_url,
"sessions": sessions,
"session_list_id": list_id,
"next_session_id": next_session_id,
"more_sessions": more_sessions,
"less_sessions": less_sessions,
"limit": limit,
"date_names": service.get_date_names,
}
)
def sessio(request: Request, session_id: int, logged_in: bool):
session = service.get_session(session_id=session_id)
return templates.TemplateResponse(
"fragments/sessions/sessio.html",
{
"request": request,
"logged_in": logged_in,
"Pages": Pages,
"session": session,
"date_names": service.get_date_names,
}
)
def sessions_editor_row(request: Request, session_date: Optional[model.Session] = None, session_id: Optional[int] = None):
if session_date is None:
if session_id is None:
raise ValueError("Must either give session or session_id")
session_date = service.get_session(session_id=session_id)
return templates.TemplateResponse(
"fragments/sessions/session_row.html",
{
"request": request,
"session": session_date,
"date_names": service.get_date_names,
"logged_in": True,
}
)
def sessions_editor_row_editing(request, session_id: int):
session = service.get_session(session_id)
return templates.TemplateResponse(
"fragments/sessions/session_row_editing.html",
{
"request": request,
"session": session,
"date_names": service.get_date_names,
}
)
def sessions_editor_insert_row(request, session_date: Optional[model.Session] = None):
session_date = service.insert_session(session_date or service.new_session())
return sessions_editor_row(request, session_date=session_date)
def sessions_editor_post_row(request, session_date: model.Session):
service.set_session(session_date)
return sessions_editor_row(request, session_date=session_date)
def sessions_editor_delete_row(session_id: int):
service.delete_session(session_id)
return HTMLResponse()

View File

@@ -0,0 +1,73 @@
from typing import Optional
from fastapi import Request
from folkugat_web.model import temes as model
from folkugat_web.services.temes import query as temes_q
from folkugat_web.templates import templates
def title(request: Request, logged_in: bool, tema: Optional[model.Tema] = None, tema_id: Optional[int] = None):
if tema is None:
if tema_id is None:
raise ValueError("Either 'tema' or 'tema_id' must be given!")
tema = temes_q.get_tema_by_id(tema_id)
return templates.TemplateResponse(
"fragments/tema/title.html",
{
"request": request,
"logged_in": logged_in,
"tema": tema,
}
)
def title_editor(request: Request, logged_in: bool, tema_id: int):
tema = temes_q.get_tema_by_id(tema_id)
return templates.TemplateResponse(
"fragments/tema/editor/title.html",
{
"request": request,
"logged_in": logged_in,
"tema": tema,
}
)
def lyric(request: Request, logged_in: bool, tema_id: int, lyric_idx: int):
tema = temes_q.get_tema_by_id(tema_id)
if tema is None:
raise ValueError(f"No tune exists for tema_id: {tema_id}")
if len(tema.lyrics) < lyric_idx:
raise ValueError(f'Lyric index out of bounds')
lyric = tema.lyrics[lyric_idx]
return templates.TemplateResponse(
"fragments/tema/lyric.html",
{
"request": request,
"logged_in": logged_in,
"tema": tema,
"lyric_idx": lyric_idx,
"lyric": lyric,
}
)
def lyric_editor(request: Request, logged_in: bool, tema_id: int, lyric_idx: int):
tema = temes_q.get_tema_by_id(tema_id)
if tema is None:
raise ValueError(f"No tune exists for tema_id: {tema_id}")
if len(tema.lyrics) < lyric_idx:
raise ValueError(f'Lyric index out of bounds')
lyric = tema.lyrics[lyric_idx]
return templates.TemplateResponse(
"fragments/tema/editor/lyric.html",
{
"request": request,
"logged_in": logged_in,
"tema": tema,
"lyric_idx": lyric_idx,
"lyric": lyric,
}
)

View File

@@ -0,0 +1,54 @@
from fastapi import Request
from folkugat_web.model import temes as model
from folkugat_web.model.pagines import Pages
from folkugat_web.services.temes import query as temes_q
from folkugat_web.services.temes import search as temes_s
from folkugat_web.templates import templates
def temes_pagina(request: Request, logged_in: bool):
return templates.TemplateResponse(
"fragments/temes/pagina.html",
{
"request": request,
"logged_in": logged_in,
"Pages": Pages,
"menu_selected_id": Pages.Temes,
}
)
def temes_busca_result(request: Request, tema: model.Tema, logged_in: bool):
return templates.TemplateResponse(
"fragments/temes/result.html",
{
"request": request,
"logged_in": logged_in,
"tema": tema,
"LinkSubtype": model.LinkSubtype,
"LinkType": model.LinkType,
}
).body.decode('utf-8')
def temes_busca(request: Request, query: str, logged_in: bool):
temes = temes_s.busca_temes(query)
return '\n'.join(
[temes_busca_result(request, tema, logged_in)
for tema in temes]
)
def tema(request: Request, tema_id: int, logged_in: bool):
tema = temes_q.get_tema_by_id(tema_id)
return templates.TemplateResponse(
"fragments/tema/pagina.html",
{
"request": request,
"logged_in": logged_in,
"Pages": Pages,
"LinkSubtype": model.LinkSubtype,
"LinkType": model.LinkType,
"tema": tema,
}
)