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
|
|
|
|