Test Failed
Push — main ( 3adfc8...7a3e4b )
by Jochen
04:10
created

_create_brand()   A

Complexity

Conditions 1

Size

Total Lines 5
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nop 0
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
"""Populate the database with data for demonstration purposes.
2
3
:Copyright: 2014-2022 Jochen Kupperschmidt
4
:License: Revised BSD (see `LICENSE` file for details)
5
"""
6
7
from datetime import datetime
8
from decimal import Decimal
9
10
import click
11
from flask.cli import with_appcontext
12
13
from ...services.authorization import authz_service
14
from ...services.board import board_category_command_service, board_service
15
from ...services.board.transfer.models import Board, BoardID
16
from ...services.brand import brand_service
17
from ...services.brand.transfer.models import Brand
18
from ...services.page import page_service
19
from ...services.party import party_service
20
from ...services.party.transfer.models import Party
21
from ...services.shop.article import article_sequence_service, article_service
22
from ...services.shop.article.transfer.models import ArticleType
23
from ...services.shop.order import order_sequence_service
24
from ...services.shop.shop import shop_service
25
from ...services.shop.shop.transfer.models import Shop, ShopID
26
from ...services.shop.storefront import storefront_service
27
from ...services.shop.storefront.transfer.models import Storefront, StorefrontID
28
from ...services.site import site_service
29
from ...services.site.transfer.models import Site, SiteID
30
from ...services.site_navigation import site_navigation_service
31
from ...services.site_navigation.transfer.models import ItemTargetType
32
from ...services.ticketing import ticket_category_service
33
from ...services.ticketing.transfer.models import TicketCategory
34
from ...services.user import user_command_service, user_creation_service
35
from ...services.user.transfer.models import User
36
from ...typing import BrandID, PartyID, UserID
37
from ...util.money import Money
38
39
40
@click.command()
41
@with_appcontext
42
def create_demodata() -> None:
43
    """Generate data for demonstration purposes."""
44
    admin = _create_admin()
45
    brand = _create_brand()
46
    party = _create_party(brand.id)
47
    board = _create_board(brand.id)
48
    ticket_category = _create_ticket_category(party.id)
49
    shop = _create_shop(brand.id)
50
    _create_shop_articles(shop.id, ticket_category)
51
    storefront = _create_shop_storefront(shop.id)
52
    site = _create_site(brand.id, party.id, board.id, storefront.id)
53
    _create_pages(site.id, admin.id)
54
55
56
def _create_admin() -> User:
57
    user, _ = user_creation_service.create_user(
58
        'DemoAdmin', '[email protected]', 'demodemo', locale='en'
59
    )
60
    user_command_service.initialize_account(user.id)
61
62
    for role_id in authz_service.get_all_role_ids():
63
        authz_service.assign_role_to_user(role_id, user.id)
64
65
    return user
66
67
68
def _create_brand() -> Brand:
69
    click.echo('Creating brand ... ', nl=False)
70
    brand = brand_service.create_brand(BrandID('cozylan'), 'CozyLAN')
71
    click.secho('done. ', fg='green')
72
    return brand
73
74
75
def _create_party(brand_id: BrandID) -> Party:
76
    click.echo('Creating party ... ', nl=False)
77
    party = party_service.create_party(
78
        PartyID('cozylan-2023'),
79
        brand_id,
80
        'CozyLAN 2023',
81
        datetime(2023, 6, 23, 16, 0),
82
        datetime(2023, 6, 25, 13, 0),
83
        max_ticket_quantity=120,
84
        ticket_management_enabled=True,
85
        seat_management_enabled=True,
86
    )
87
    click.secho('done. ', fg='green')
88
    return party
89
90
91
def _create_board(brand_id: BrandID) -> Board:
92
    click.echo('Creating board ... ', nl=False)
93
    board = board_service.create_board(brand_id, BoardID('cozylan'))
94
    click.secho('done. ', fg='green')
95
96
    click.echo('Creating board categories ... ', nl=False)
97
    for slug, title, description in [
98
        (
99
            'general',
100
            'General',
101
            'General party-related questions and discussions',
102
        ),
103
        ('car-sharing', 'Car Sharing', 'Need a ride or have free seats?'),
104
        ('off-topic', 'Off-Topic', 'Everything else'),
105
    ]:
106
        board_category_command_service.create_category(
107
            board.id, slug, title, description
108
        )
109
    click.secho('done. ', fg='green')
110
111
    return board
112
113
114
def _create_ticket_category(party_id: PartyID) -> TicketCategory:
115
    return ticket_category_service.create_category(party_id, 'Standard')
116
117
118
def _create_shop(brand_id: BrandID) -> Shop:
119
    click.echo('Creating shop ... ', nl=False)
120
    shop = shop_service.create_shop(
121
        ShopID('cozylan'), brand_id, 'CozyLAN Shop', 'EUR'
122
    )
123
    click.secho('done. ', fg='green')
124
    return shop
125
126
127
def _create_shop_articles(
128
    shop_id: ShopID, ticket_category: TicketCategory
129
) -> None:
130
    click.echo('Creating shop articles ... ', nl=False)
131
132
    article_number_sequence = (
133
        article_sequence_service.create_article_number_sequence(
134
            shop_id, 'A-CL2023-'
135
        )
136
    )
137
138
    article_number_ticket = article_sequence_service.generate_article_number(
139
        article_number_sequence.id
140
    )
141
    article_service.create_ticket_article(
142
        shop_id,
143
        article_number_ticket,
144
        f'Ticket "{ticket_category.title}"',
145
        Money(Decimal('35.00'), 'EUR'),
146
        Decimal('0.19'),
147
        120,
148
        5,
149
        ticket_category.id,
150
    )
151
152
    article_number_merch = article_sequence_service.generate_article_number(
153
        article_number_sequence.id
154
    )
155
    article_service.create_article(
156
        shop_id,
157
        article_number_merch,
158
        ArticleType.physical,
159
        'Sticker Pack',
160
        Money(Decimal('5.00'), 'EUR'),
161
        Decimal('0.19'),
162
        300,
163
        10,
164
        True,
165
    )
166
167
    click.secho('done. ', fg='green')
168
169
170
def _create_shop_storefront(shop_id: ShopID) -> Storefront:
171
    click.echo('Creating shop storefront ... ', nl=False)
172
    order_number_sequence_id = (
173
        order_sequence_service.create_order_number_sequence(
174
            shop_id, 'O-CL2023-'
175
        ).id
176
    )
177
    storefront = storefront_service.create_storefront(
178
        StorefrontID('cozylan'), shop_id, order_number_sequence_id, closed=False
179
    )
180
    click.secho('done. ', fg='green')
181
    return storefront
182
183
184
def _create_site(
185
    brand_id: BrandID,
186
    party_id: PartyID,
187
    board_id: BoardID,
188
    storefront_id: StorefrontID,
189
) -> Site:
190
    click.echo('Creating site ... ', nl=False)
191
    site = site_service.create_site(
192
        SiteID('cozylan'),
193
        'CozyLAN Website',
194
        'cozylan.example',
195
        brand_id,
196
        enabled=True,
197
        user_account_creation_enabled=True,
198
        login_enabled=True,
199
        party_id=party_id,
200
        board_id=board_id,
201
        storefront_id=storefront_id,
202
    )
203
    click.secho('done. ', fg='green')
204
    return site
205
206
207
def _create_pages(site_id: SiteID, creator_id: UserID) -> None:
208
    page_imprint_en = page_service.create_page(
209
        site_id,
210
        'imprint',
211
        'en',
212
        '/imprint',
213
        creator_id,
214
        'Imprint',
215
        'Legal stuff goes here.',
216
    )
217
218
    page_imprint_de = page_service.create_page(
219
        site_id,
220
        'impressum',
221
        'de',
222
        '/impressum',
223
        creator_id,
224
        'Impressum',
225
        'Hier kommt das Impressum hin.',
226
    )
227
228
    nav_main_en = site_navigation_service.create_menu(site_id, 'main', 'en')
229
    nav_main_de = site_navigation_service.create_menu(site_id, 'main', 'de')
230
231
    site_navigation_service.create_item(
232
        nav_main_en.id, ItemTargetType.page, 'imprint', 'Imprint', 'imprint'
233
    )
234
    site_navigation_service.create_item(
235
        nav_main_de.id, ItemTargetType.page, 'imprint', 'Impressum', 'imprint'
236
    )
237