Passed
Push — main ( 058650...b4a17c )
by Jochen
04:36
created

update_channel()   A

Complexity

Conditions 1

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1.512

Importance

Changes 0
Metric Value
cc 1
eloc 7
nop 2
dl 0
loc 12
ccs 1
cts 5
cp 0.2
crap 1.512
rs 10
c 0
b 0
f 0
1
"""
2
byceps.services.news.channel_service
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2006-2022 Jochen Kupperschmidt
6
:License: Revised BSD (see `LICENSE` file for details)
7
"""
8
9 1
from __future__ import annotations
10 1
from typing import Optional, Sequence
11
12 1
from ...database import db
13 1
from ...typing import BrandID
14
15 1
from ..brand import service as brand_service
16 1
from ..site.transfer.models import SiteID
17
18 1
from .dbmodels.channel import Channel as DbChannel
19 1
from .transfer.models import Channel, ChannelID
20
21
22 1
def create_channel(
23
    brand_id: BrandID,
24
    channel_id: ChannelID,
25
    url_prefix: str,
26
    *,
27
    announcement_site_id: Optional[SiteID] = None,
28
) -> Channel:
29
    """Create a channel for that brand."""
30 1
    brand = brand_service.find_brand(brand_id)
31 1
    if brand is None:
32
        raise ValueError(f'Unknown brand ID "{brand_id}"')
33
34 1
    db_channel = DbChannel(
35
        channel_id,
36
        brand.id,
37
        url_prefix,
38
        announcement_site_id=announcement_site_id,
39
    )
40
41 1
    db.session.add(db_channel)
42 1
    db.session.commit()
43
44 1
    return _db_entity_to_channel(db_channel)
45
46
47 1
def update_channel(
48
    channel_id: ChannelID,
49
    announcement_site_id: Optional[SiteID],
50
) -> Channel:
51
    """Update a channel."""
52
    db_channel = get_db_channel(channel_id)
53
54
    db_channel.announcement_site_id = announcement_site_id
55
56
    db.session.commit()
57
58
    return _db_entity_to_channel(db_channel)
59
60
61 1
def delete_channel(channel_id: ChannelID) -> None:
62
    """Delete a news channel."""
63 1
    db.session.query(DbChannel) \
64
        .filter_by(id=channel_id) \
65
        .delete()
66
67 1
    db.session.commit()
68
69
70 1
def _find_db_channel(channel_id: ChannelID) -> Optional[DbChannel]:
71 1
    return db.session.get(DbChannel, channel_id)
72
73
74 1
def get_db_channel(channel_id: ChannelID) -> DbChannel:
75 1
    db_channel = _find_db_channel(channel_id)
76
77 1
    if db_channel is None:
78
        raise ValueError(f'Unknown channel ID "{channel_id}"')
79
80 1
    return db_channel
81
82
83 1
def find_channel(channel_id: ChannelID) -> Optional[Channel]:
84
    """Return the channel with that id, or `None` if not found."""
85 1
    db_channel = _find_db_channel(channel_id)
86
87 1
    if db_channel is None:
88 1
        return None
89
90 1
    return _db_entity_to_channel(db_channel)
91
92
93 1
def get_channel(channel_id: ChannelID) -> Channel:
94
    """Return the channel with that id, or raise an exception."""
95
    db_channel = get_db_channel(channel_id)
96
    return _db_entity_to_channel(db_channel)
97
98
99 1
def get_channels(channel_ids: set[ChannelID]) -> set[Channel]:
100
    """Return these channels."""
101 1
    db_channels = db.session \
102
        .query(DbChannel) \
103
        .filter(DbChannel.id.in_(channel_ids)) \
104
        .all()
105
106 1
    return {_db_entity_to_channel(db_channel) for db_channel in db_channels}
107
108
109 1
def get_all_channels() -> list[Channel]:
110
    """Return all channels."""
111
    db_channels = db.session.query(DbChannel).all()
112
113
    return [_db_entity_to_channel(db_channel) for db_channel in db_channels]
114
115
116 1
def get_channels_for_brand(brand_id: BrandID) -> Sequence[Channel]:
117
    """Return all channels that belong to the brand."""
118 1
    db_channels = db.session \
119
        .query(DbChannel) \
120
        .filter_by(brand_id=brand_id) \
121
        .order_by(DbChannel.id) \
122
        .all()
123
124 1
    return [_db_entity_to_channel(db_channel) for db_channel in db_channels]
125
126
127 1
def _db_entity_to_channel(db_channel: DbChannel) -> Channel:
128 1
    return Channel(
129
        id=db_channel.id,
130
        brand_id=db_channel.brand_id,
131
        url_prefix=db_channel.url_prefix,
132
        announcement_site_id=db_channel.announcement_site_id,
133
    )
134