Passed
Push — main ( 766c25...7e075a )
by Jochen
01:34
created

_db_entity_to_item()   A

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 8
nop 1
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
"""
2
byceps.services.timetable.timetable_service
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2014-2023 Jochen Kupperschmidt
6
:License: Revised BSD (see `LICENSE` file for details)
7
"""
8
9
from datetime import datetime
10
11
from sqlalchemy import select
12
13
from byceps.database import db
14
from byceps.services.party import party_service
15
from byceps.services.party.models import PartyID
16
17
from . import timetable_domain_service
18
from .dbmodels import DbTimetable, DbTimetableItem
19
from .models import Timetable, TimetableID, TimetableItem
20
21
22
def create_timetable(
23
    party_id: PartyID,
24
    hidden: bool,
25
) -> Timetable:
26
    """Create a timetable."""
27
    party = party_service.get_party(party_id)
28
29
    timetable = timetable_domain_service.create_timetable(party.id, hidden)
30
31
    db_timetable = DbTimetable(
32
        timetable.id,
33
        timetable.party_id,
34
        timetable.hidden,
35
    )
36
    db.session.add(db_timetable)
37
    db.session.commit()
38
39
    return timetable
40
41
42
def create_item(
43
    timetable_id: TimetableID,
44
    scheduled_at: datetime,
45
    description: str,
46
    location: str | None,
47
    hidden: bool,
48
) -> TimetableItem:
49
    """Create a timetable item."""
50
    item = timetable_domain_service.create_item(
51
        timetable_id, scheduled_at, description, location, hidden
52
    )
53
54
    db_item = DbTimetableItem(
55
        item.id,
56
        item.timetable_id,
57
        item.scheduled_at,
58
        item.description,
59
        item.location,
60
        item.hidden,
61
    )
62
    db.session.add(db_item)
63
    db.session.commit()
64
65
    return item
66
67
68
def find_timetable(party_id: PartyID) -> Timetable | None:
69
    """Return the timetable for the party."""
70
    db_timetable = db.session.scalars(
71
        select(DbTimetable).filter_by(id=party_id)
72
    ).one_or_none()
73
74
    if db_timetable is None:
75
        return None
76
77
    db_items = db.session.scalars(
78
        select(DbTimetableItem).filter_by(timetable_id=db_timetable.id)
79
    ).all()
80
81
    items = [_db_entity_to_item(db_item) for db_item in db_items]
82
    items.sort(key=lambda item: (item.scheduled_at, item.description))
83
84
    return _db_entity_to_timetable(db_timetable, items)
85
86
87
def _db_entity_to_timetable(
88
    db_timetable: DbTimetable, items: list[TimetableItem]
89
) -> Timetable:
90
    return Timetable(
91
        id=db_timetable.id,
92
        party_id=db_timetable.party_id,
93
        hidden=db_timetable.hidden,
94
        items=items,
95
    )
96
97
98
def _db_entity_to_item(db_item: DbTimetableItem) -> TimetableItem:
99
    return TimetableItem(
100
        id=db_item.id,
101
        timetable_id=db_item.timetable_id,
102
        scheduled_at=db_item.scheduled_at,
103
        description=db_item.description,
104
        location=db_item.location,
105
        hidden=db_item.hidden,
106
    )
107