Skip to content

Commit 7d1c10f

Browse files
committed
additional Piccolo Admin configuration
1 parent a509de9 commit 7d1c10f

File tree

5 files changed

+82
-15
lines changed

5 files changed

+82
-15
lines changed

.env.example

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,3 @@ DB_PORT=5432
66
USERNAME="piccolo"
77
PASSWORD="piccolo123"
88
9-
TABLES_TO_SHOW=""

Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ WORKDIR /code
44

55
COPY ./requirements.txt /code/requirements.txt
66

7+
COPY ./config.yaml /code/config.yaml
8+
79
RUN pip install --no-cache-dir -r /code/requirements.txt
810

911
COPY ./app /code/app

app/main.py

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
11
import asyncio
22
import os
33

4+
import yaml
45
from hypercorn import Config
56
from hypercorn.asyncio import serve
67
from piccolo.apps.user.tables import BaseUser
78
from piccolo.engine import PostgresEngine
89
from piccolo.engine.sqlite import SQLiteEngine
910
from piccolo.table import create_db_tables
1011
from piccolo.table_reflection import TableStorage
11-
from piccolo_admin import create_admin
12+
from piccolo_admin.endpoints import TableConfig, create_admin
1213
from piccolo_api.encryption.providers import XChaCha20Provider
1314
from piccolo_api.mfa.authenticator.provider import AuthenticatorProvider
1415
from piccolo_api.mfa.authenticator.tables import (
1516
AuthenticatorSecret as AuthenticatorSecret_,
1617
)
1718
from piccolo_api.session_auth.tables import SessionsBase
1819

20+
with open("config.yaml") as stream:
21+
try:
22+
admin_config = yaml.safe_load(stream)
23+
BASE_CONFIG = admin_config["tables"]
24+
except yaml.YAMLError as exc:
25+
raise exc
26+
1927
DB = SQLiteEngine()
2028

2129

@@ -60,32 +68,52 @@ async def main():
6068
extensions=tuple(),
6169
)
6270

63-
tables_to_show = [
64-
table_to_show.lower().strip()
65-
for table_to_show in os.environ["TABLES_TO_SHOW"].split(",")
66-
]
67-
6871
storage = TableStorage(engine=db)
6972
await storage.reflect(schema_name="public")
7073

71-
# tables to show in admin
72-
if len(tables_to_show) == 1:
73-
found_tables = storage.tables.values()
74-
else:
74+
# additional configuration of admin tables
75+
if BASE_CONFIG is not None:
76+
tables_to_show = [table.lower() for table in BASE_CONFIG]
7577
found_tables = [
7678
table
7779
for table in storage.tables.values()
7880
if table._meta.tablename in tables_to_show
7981
]
82+
admin_tables = []
83+
for table in found_tables:
84+
capitalize_table_name = table._meta.tablename.capitalize()
85+
admin_tables.append(
86+
TableConfig(
87+
table_class=table,
88+
visible_columns=[
89+
column
90+
for column in table._meta.columns
91+
if column._meta.name
92+
in BASE_CONFIG[capitalize_table_name]["visible_columns"]
93+
],
94+
visible_filters=[
95+
column
96+
for column in table._meta.columns
97+
if column._meta.name
98+
in BASE_CONFIG[capitalize_table_name]["visible_filters"]
99+
],
100+
menu_group=BASE_CONFIG[capitalize_table_name]["menu_group"],
101+
)
102+
)
103+
else:
104+
admin_tables = storage.tables.values()
80105

81-
for table_class in found_tables:
82-
table_class._meta._db = db
106+
for table in admin_tables:
107+
if isinstance(table, TableConfig):
108+
table.table_class._meta._db = db
109+
else:
110+
table._meta._db = db
83111

84112
# create new encription key for MFA
85113
encryption_key = XChaCha20Provider.get_new_key()
86114

87115
app = create_admin(
88-
found_tables,
116+
admin_tables,
89117
auth_table=User,
90118
session_table=Sessions,
91119
auto_include_related=False,

config.yaml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
tables:
2+
# An example of additional Piccolo Admin configuration
3+
# Actor:
4+
# visible_columns:
5+
# - actor_id
6+
# - first_name
7+
# visible_filters:
8+
# - actor_id
9+
# - first_name
10+
# menu_group: Movies
11+
# Address:
12+
# visible_columns:
13+
# - address_id
14+
# - address
15+
# - city_id
16+
# visible_filters:
17+
# - address_id
18+
# - address
19+
# - city_id
20+
# menu_group: Location
21+
# City:
22+
# visible_columns:
23+
# - city_id
24+
# - city
25+
# visible_filters:
26+
# - city_id
27+
# - city
28+
# menu_group: Location
29+
# Country:
30+
# visible_columns:
31+
# - country_id
32+
# - country
33+
# visible_filters:
34+
# - country_id
35+
# - country
36+
# menu_group: Location
37+

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ aiosqlite
33
hypercorn
44
piccolo
55
piccolo-admin
6-
piccolo_api[authenticator,pynacl]
6+
piccolo_api[authenticator,pynacl]
7+
pyyaml

0 commit comments

Comments
 (0)