Skip to content

Commit 376f0ac

Browse files
authored
Merge pull request #3 from sinisaos/use_pydantic
use Pydantic to parse yaml
2 parents 52eb004 + b4613c1 commit 376f0ac

File tree

5 files changed

+104
-106
lines changed

5 files changed

+104
-106
lines changed

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ Example of `config.yaml`:
3939
```yaml
4040
tables:
4141
# An example of additional Piccolo Admin configuration
42-
Actor:
42+
- table_name: actor
4343
visible_columns:
4444
- first_name
4545
visible_filters:
4646
- actor_id
4747
- first_name
4848
menu_group: Movies
4949
link_column: first_name
50-
Address:
50+
- table_name: address
5151
visible_columns:
5252
- address_id
5353
- address
@@ -57,23 +57,23 @@ tables:
5757
- address
5858
- city_id
5959
menu_group: Location
60-
rich_text_columns: address
61-
City:
60+
rich_text_columns:
61+
- address
62+
- table_name: city
6263
visible_columns:
6364
- city_id
6465
- city
6566
visible_filters:
6667
- city_id
6768
- city
6869
menu_group: Location
69-
Country:
70+
- table_name: country
7071
visible_columns:
7172
- country_id
7273
- country
7374
visible_filters:
7475
- country_id
7576
- country
76-
menu_group: Location
7777

7878
sidebar_links:
7979
Piccolo Admin: https://piccolo-admin.readthedocs.io/en/latest/index.html

app/main.py

Lines changed: 50 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,16 @@
11
import asyncio
22
import os
33

4-
import yaml
54
from hypercorn import Config
65
from hypercorn.asyncio import serve
7-
from piccolo.apps.user.tables import BaseUser
86
from piccolo.engine import PostgresEngine
9-
from piccolo.engine.sqlite import SQLiteEngine
107
from piccolo.table import create_db_tables
118
from piccolo.table_reflection import TableStorage
129
from piccolo_admin.endpoints import TableConfig, create_admin
1310
from piccolo_api.encryption.providers import XChaCha20Provider
1411
from piccolo_api.mfa.authenticator.provider import AuthenticatorProvider
15-
from piccolo_api.mfa.authenticator.tables import (
16-
AuthenticatorSecret as AuthenticatorSecret_,
17-
)
18-
from piccolo_api.session_auth.tables import SessionsBase
19-
20-
with open("config.yaml") as stream:
21-
try:
22-
admin_config = yaml.safe_load(stream)
23-
BASE_CONFIG = admin_config.get("tables")
24-
except yaml.YAMLError as exc:
25-
raise exc
26-
27-
DB = SQLiteEngine()
28-
29-
30-
class Sessions(SessionsBase, db=DB):
31-
pass
32-
33-
34-
class User(BaseUser, tablename="piccolo_user", db=DB):
35-
pass
36-
37-
38-
class AuthenticatorSecret(AuthenticatorSecret_, db=DB):
39-
pass
12+
from tables import AuthenticatorSecret, Sessions, User
13+
from utils import additional_config
4014

4115

4216
async def main():
@@ -72,79 +46,55 @@ async def main():
7246
await storage.reflect(schema_name="public")
7347

7448
# additional configuration of admin tables
75-
if BASE_CONFIG is not None:
76-
tables_to_show = [table.lower() for table in BASE_CONFIG]
77-
found_tables = [
78-
table
79-
for table in storage.tables.values()
80-
if table._meta.tablename in tables_to_show
81-
]
49+
if additional_config.tables is not None:
8250
admin_tables = []
83-
for table in found_tables:
84-
capitalize_table_name = table._meta.tablename.capitalize()
85-
# visible columns
86-
try:
87-
visible_columns = [
88-
column
89-
for column in table._meta.columns
90-
if column._meta.name
91-
in BASE_CONFIG[capitalize_table_name].get(
92-
"visible_columns", None
93-
)
94-
]
95-
except TypeError:
96-
visible_columns = None
97-
# visible filters
98-
try:
99-
visible_filters = [
100-
column
101-
for column in table._meta.columns
102-
if column._meta.name
103-
in BASE_CONFIG[capitalize_table_name].get(
104-
"visible_filters", None
51+
for config in additional_config.tables:
52+
for table in storage.tables.values():
53+
if table._meta.tablename == config.table_name:
54+
# visible columns
55+
if config.visible_columns:
56+
visible_columns = [
57+
table._meta.get_column_by_name(column_name)
58+
for column_name in config.visible_columns
59+
]
60+
else:
61+
visible_columns = table._meta.columns
62+
# visible filters
63+
if config.visible_filters:
64+
visible_filters = [
65+
table._meta.get_column_by_name(column_name)
66+
for column_name in config.visible_filters
67+
]
68+
else:
69+
visible_filters = table._meta.columns
70+
# rich text columns
71+
if config.rich_text_columns:
72+
rich_text_columns = [
73+
table._meta.get_column_by_name(column_name)
74+
for column_name in config.rich_text_columns
75+
]
76+
else:
77+
rich_text_columns = None
78+
# link column
79+
if config.link_column:
80+
link_column = table._meta.get_column_by_name(
81+
config.link_column
82+
)
83+
else:
84+
link_column = None
85+
# menu_group
86+
menu_group = config.menu_group
87+
88+
admin_tables.append(
89+
TableConfig(
90+
table_class=table,
91+
visible_columns=visible_columns,
92+
visible_filters=visible_filters,
93+
rich_text_columns=rich_text_columns,
94+
link_column=link_column,
95+
menu_group=menu_group,
96+
)
10597
)
106-
]
107-
except TypeError:
108-
visible_filters = None
109-
# rich text columns
110-
try:
111-
rich_text_columns = [
112-
column
113-
for column in table._meta.columns
114-
if column._meta.name
115-
in BASE_CONFIG[capitalize_table_name].get(
116-
"rich_text_columns", None
117-
)
118-
]
119-
except TypeError:
120-
rich_text_columns = None
121-
# link column
122-
try:
123-
link_column = [
124-
column
125-
for column in table._meta.columns
126-
if column._meta.name
127-
== BASE_CONFIG[capitalize_table_name].get(
128-
"link_column", None
129-
)
130-
][0]
131-
except IndexError:
132-
link_column = None
133-
# menu_group
134-
menu_group = BASE_CONFIG[capitalize_table_name].get(
135-
"menu_group", None
136-
)
137-
138-
admin_tables.append(
139-
TableConfig(
140-
table_class=table,
141-
visible_columns=visible_columns,
142-
visible_filters=visible_filters,
143-
rich_text_columns=rich_text_columns,
144-
link_column=link_column,
145-
menu_group=menu_group,
146-
)
147-
)
14898
else:
14999
admin_tables = storage.tables.values()
150100

@@ -170,7 +120,7 @@ async def main():
170120
secret_table=AuthenticatorSecret,
171121
),
172122
],
173-
sidebar_links=admin_config.get("sidebar_links", None),
123+
sidebar_links=additional_config.sidebar_links or {},
174124
)
175125

176126
# Server

app/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import typing as t
2+
3+
from pydantic import BaseModel
4+
5+
6+
class AdminTable(BaseModel):
7+
table_name: t.Optional[str] = None
8+
visible_columns: t.Optional[list[str]] = None
9+
visible_filters: t.Optional[list[str]] = None
10+
rich_text_columns: t.Optional[list[str]] = None
11+
link_column: t.Optional[str] = None
12+
menu_group: t.Optional[str] = None
13+
14+
15+
class AdditionalConfig(BaseModel):
16+
tables: t.Optional[list[AdminTable]] = None
17+
sidebar_links: t.Optional[dict[str, str]] = None

app/tables.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from piccolo.apps.user.tables import BaseUser
2+
from piccolo.engine.sqlite import SQLiteEngine
3+
from piccolo_api.mfa.authenticator.tables import (
4+
AuthenticatorSecret as AuthenticatorSecret_,
5+
)
6+
from piccolo_api.session_auth.tables import SessionsBase
7+
8+
DB = SQLiteEngine()
9+
10+
11+
class Sessions(SessionsBase, db=DB):
12+
pass
13+
14+
15+
class User(BaseUser, tablename="piccolo_user", db=DB):
16+
pass
17+
18+
19+
class AuthenticatorSecret(AuthenticatorSecret_, db=DB):
20+
pass

app/utils.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import yaml
2+
from models import AdditionalConfig
3+
4+
5+
def load_yaml() -> AdditionalConfig:
6+
with open("config.yaml") as file:
7+
admin_config = yaml.safe_load(file)
8+
return AdditionalConfig(**admin_config)
9+
10+
11+
additional_config = load_yaml()

0 commit comments

Comments
 (0)