diff --git a/app/crud.py b/app/crud.py
index 3295529..850d6b1 100644
--- a/app/crud.py
+++ b/app/crud.py
@@ -1,8 +1,11 @@
import app.models as models
from sqlalchemy import func
+from sqlalchemy.orm.attributes import flag_modified
-def get_songs_and_vote_for_user(db, user_id) -> list[models.Song]:
- votes = db.query(models.Vote).filter(models.Vote.user_id == user_id).subquery()
+def get_songs_and_vote_for_session(db, session_name) -> list[models.Song]:
+ session_entry = activate_session(db, session_name)
+
+ votes = db.query(models.Vote).filter(models.Vote.session_id == session_entry.id).subquery()
songs_and_votes = db.query(
models.Song, votes.c.vote
@@ -58,12 +61,38 @@ def create_song(db,
db.commit()
-def create_or_update_vote(db, song_id, user_id, vote):
+def create_or_update_vote(db, song_id, session_name, vote):
+ session_entry = activate_session(db, session_name)
+
vote_entry = db.query(models.Vote).filter(
- (models.Vote.user_id == user_id) & (models.Vote.song_id == song_id)).first()
+ (models.Vote.session_id == session_entry.id) & (models.Vote.song_id == song_id)).first()
if vote_entry:
vote_entry.vote = str(vote) # type: ignore
else:
- vote_entry = models.Vote(song_id=song_id, user_id=user_id, vote=vote)
+ vote_entry = models.Vote(song_id=song_id, session_id=session_entry.id, vote=vote)
db.add(vote_entry)
db.commit()
+
+
+def activate_session(db, session_name):
+ session_entry = db.query(models.Session).filter(
+ (models.Session.session_name == session_name)).first()
+ if session_entry:
+ session_entry.active = True
+ else:
+ session_entry = models.Session(session_name=session_name, active=True)
+ db.add(session_entry)
+ flag_modified(session_entry, "active")
+ db.commit()
+
+ return session_entry
+
+def deactivate_session(db, session_name):
+ session_entry = db.query(models.Session).filter(
+ (models.Session.session_name == session_name)).first()
+ if session_entry:
+ session_entry.active = False
+ else:
+ session_entry = models.Session(session_name=session_name, active=False)
+ db.add(session_entry)
+ db.commit()
\ No newline at end of file
diff --git a/app/main.py b/app/main.py
index 598e7ec..a9001a5 100644
--- a/app/main.py
+++ b/app/main.py
@@ -1,10 +1,10 @@
from fastapi import FastAPI, Request, Depends
-from app.routers import admin, user, songs
+from app.routers import admin, user, songs, session
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from app.database import engine, Base, get_db
-from app.crud import get_songs_and_vote_for_user
+from app.crud import get_songs_and_vote_for_session
from sqlalchemy.orm import Session
from typing import Annotated
from app.schemas import Song
@@ -16,6 +16,7 @@ app = FastAPI()
app.include_router(admin.router)
app.include_router(user.router)
app.include_router(songs.router)
+app.include_router(session.router)
app.mount("/static", StaticFiles(directory="static"), name="static")
@@ -28,7 +29,7 @@ async def root(request: Request, session_id : str = "", db: Annotated[Session, D
request=request, name="landing.html"
)
else:
- songs = [Song(**s.__dict__, vote=v) for s, v in get_songs_and_vote_for_user(db, session_id)]
+ songs = [Song(**s.__dict__, vote=v) for s, v in get_songs_and_vote_for_session(db, session_id)]
songs_by_category = {}
all_categories = set()
diff --git a/app/models.py b/app/models.py
index 110b612..b72a0fe 100644
--- a/app/models.py
+++ b/app/models.py
@@ -25,11 +25,20 @@ class Song(Base):
singable: Mapped[Optional[bool]]
+class Session(Base):
+ __tablename__ = 'sessions'
+ id: Mapped[int] = mapped_column(primary_key=True)
+ session_name: Mapped[int]
+ active: Mapped[bool]
+ time_created: Mapped[datetime] = mapped_column(server_default=func.now())
+ time_updated: Mapped[Optional[datetime]
+ ] = mapped_column(onupdate=func.now())
+
class Vote(Base):
__tablename__ = 'votes'
id: Mapped[int] = mapped_column(primary_key=True)
song_id: Mapped[int] = mapped_column(Integer, ForeignKey("songs.id"))
- user_id: Mapped[int]
+ session_id: Mapped[int] = mapped_column(Integer, ForeignKey("sessions.id"))
vote: Mapped[Optional[int]]
time_created: Mapped[datetime] = mapped_column(server_default=func.now())
time_updated: Mapped[Optional[datetime]
diff --git a/app/routers/session.py b/app/routers/session.py
new file mode 100644
index 0000000..0703d73
--- /dev/null
+++ b/app/routers/session.py
@@ -0,0 +1,27 @@
+from typing import Annotated
+from fastapi import APIRouter, Depends
+from sqlalchemy.orm import Session
+
+import app.models as models
+from app.database import get_db
+from app.schemas import Song
+import app.crud as crud
+
+router = APIRouter(
+ prefix="/session",
+ # dependencies=[Security(get_current_user, scopes=["public"])],
+ responses={404: {"description": "Not found"}},
+)
+
+
+@router.put("/{session_id}")
+async def activate_session(session_id: str = "", db: Annotated[Session, Depends(get_db)] = None):
+ crud.activate_session(db, session_id)
+
+@router.delete("/{session_id}")
+async def deactivate_session(session_id: str = "", db: Annotated[Session, Depends(get_db)] = None):
+ crud.deactivate_session(db, session_id)
+
+#@router.get("/{session_id}")
+#async def get_session(session_id: str = "", db: Annotated[Session, Depends(get_db)] = None):
+# return "get " + session_id
\ No newline at end of file
diff --git a/app/routers/songs.py b/app/routers/songs.py
index e5c3eb9..3893ba2 100644
--- a/app/routers/songs.py
+++ b/app/routers/songs.py
@@ -5,7 +5,7 @@ from sqlalchemy.orm import Session
import app.models as models
from app.database import get_db
from app.schemas import Song
-from app.crud import get_songs_and_vote_for_user, create_or_update_vote, get_all_songs_and_votes
+from app.crud import get_songs_and_vote_for_session, create_or_update_vote, get_all_songs_and_votes
router = APIRouter(
prefix="/songs",
@@ -15,13 +15,13 @@ router = APIRouter(
@router.get("/")
-async def get_songs(user_id: str = "", db: Annotated[Session, Depends(get_db)] = None) -> list[Song]:
- return [Song(**s.__dict__, vote=v) for s, v in get_songs_and_vote_for_user(db, user_id)]
+async def get_songs(session_id: str = "", db: Annotated[Session, Depends(get_db)] = None) -> list[Song]:
+ return [Song(**s.__dict__, vote=v) for s, v in get_songs_and_vote_for_session(db, session_id)]
@router.post("/{song_id}/vote")
-async def vote(song_id: str, user_id: str, vote: int, db: Annotated[Session, Depends(get_db)]):
- create_or_update_vote(db, song_id, user_id, vote)
+async def vote(song_id: str, session_id: str, vote: int, db: Annotated[Session, Depends(get_db)]):
+ create_or_update_vote(db, song_id, session_id, vote)
@router.get("/evaluation")
diff --git a/templates/voting.html b/templates/voting.html
index 576fde5..d6690cb 100644
--- a/templates/voting.html
+++ b/templates/voting.html
@@ -12,6 +12,34 @@