Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 41 additions & 10 deletions server/controllers/api/v1/show/cast.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from collections import defaultdict

from sqlalchemy import select
from sqlalchemy.orm import selectinload
from tornado import escape

from controllers.api.constants import (
Expand All @@ -11,8 +12,16 @@
ERROR_LAST_NAME_MISSING,
ERROR_SHOW_NOT_FOUND,
)
from models.script import Script, ScriptLine, ScriptLineType, ScriptRevision
from models.show import Cast, Character, Show
from models.script import (
Script,
ScriptCuts,
ScriptLine,
ScriptLinePart,
ScriptLineRevisionAssociation,
ScriptLineType,
ScriptRevision,
)
from models.show import Cast, CharacterGroup, Show
from rbac.role import Role
from schemas.schemas import CastSchema
from utils.web.base_controller import BaseAPIController
Expand Down Expand Up @@ -186,28 +195,50 @@ async def get(self):
select(Script).where(Script.show_id == show.id)
).first()

if script.current_revision:
revision: ScriptRevision = session.get(
ScriptRevision, script.current_revision
)
else:
if not script.current_revision:
self.set_status(400)
await self.finish(
{"message": "Script does not have a current revision"}
)
return

revision: ScriptRevision = session.scalars(
select(ScriptRevision)
.where(ScriptRevision.id == script.current_revision)
.options(
selectinload(ScriptRevision.line_associations)
.selectinload(ScriptLineRevisionAssociation.line)
.options(
selectinload(ScriptLine.line_parts).options(
selectinload(ScriptLinePart.character),
selectinload(
ScriptLinePart.character_group
).selectinload(CharacterGroup.characters),
)
)
)
).first()

# Load all cut line_part_ids for this revision in a single query.
cut_part_ids: set[int] = set(
session.scalars(
select(ScriptCuts.line_part_id).where(
ScriptCuts.revision_id == revision.id
)
).all()
)

line_counts = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
for line_association in revision.line_associations:
line: ScriptLine = line_association.line
if line.line_type != ScriptLineType.DIALOGUE:
continue
for line_part in line.line_parts:
if line_part.line_part_cuts is not None:
if line_part.id in cut_part_ids:
continue
if line_part.character_id:
character = session.get(Character, line_part.character_id)
if character.played_by:
character = line_part.character
if character and character.played_by:
line_counts[character.played_by][line.act_id][
line.scene_id
] += 1
Expand Down
50 changes: 42 additions & 8 deletions server/controllers/api/v1/show/characters.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from collections import defaultdict

from sqlalchemy import select, update
from sqlalchemy.orm import selectinload
from tornado import escape

from controllers.api.constants import (
Expand All @@ -15,8 +16,10 @@
)
from models.script import (
Script,
ScriptCuts,
ScriptLine,
ScriptLinePart,
ScriptLineRevisionAssociation,
ScriptLineType,
ScriptRevision,
)
Expand All @@ -39,9 +42,19 @@ def get(self):
with self.make_session() as session:
show = session.get(Show, show_id)
if show:
characters = [character_schema.dump(c) for c in show.character_list]
characters = session.scalars(
select(Character)
.where(Character.show_id == show.id)
.options(
selectinload(Character.character_groups),
selectinload(Character.mic_allocations),
selectinload(Character.cast_member),
)
).all()
self.set_status(200)
self.finish({"characters": characters})
self.finish(
{"characters": [character_schema.dump(c) for c in characters]}
)
else:
self.set_status(404)
self.finish({"message": ERROR_SHOW_NOT_FOUND})
Expand Down Expand Up @@ -294,24 +307,45 @@ async def get(self):
select(Script).where(Script.show_id == show.id)
).first()

if script.current_revision:
revision: ScriptRevision = session.get(
ScriptRevision, script.current_revision
)
else:
if not script.current_revision:
self.set_status(400)
await self.finish(
{"message": "Script does not have a current revision"}
)
return

revision: ScriptRevision = session.scalars(
select(ScriptRevision)
.where(ScriptRevision.id == script.current_revision)
.options(
selectinload(ScriptRevision.line_associations)
.selectinload(ScriptLineRevisionAssociation.line)
.options(
selectinload(ScriptLine.line_parts).options(
selectinload(
ScriptLinePart.character_group
).selectinload(CharacterGroup.characters),
)
)
)
).first()

# Load all cut line_part_ids for this revision in a single query.
cut_part_ids: set[int] = set(
session.scalars(
select(ScriptCuts.line_part_id).where(
ScriptCuts.revision_id == revision.id
)
).all()
)

line_counts = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
for line_association in revision.line_associations:
line: ScriptLine = line_association.line
if line.line_type != ScriptLineType.DIALOGUE:
continue
for line_part in line.line_parts:
if line_part.line_part_cuts is not None:
if line_part.id in cut_part_ids:
continue
if line_part.character_id:
line_counts[line_part.character_id][line.act_id][
Expand Down
2 changes: 2 additions & 0 deletions server/schemas/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ class Meta:
model = Act
include_relationships = True
load_instance = True
exclude = ("lines",)


@schema
Expand All @@ -178,6 +179,7 @@ class Meta:
model = Scene
include_relationships = True
load_instance = True
exclude = ("lines",)


@schema
Expand Down
Loading
Loading