Skip to content

Commit 55a9a05

Browse files
authored
feat: Auth model is market with a security icon (#19)
1 parent a8921d4 commit 55a9a05

6 files changed

Lines changed: 31 additions & 7 deletions

File tree

fastapi_forge/dtos.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,22 +145,22 @@ def target(self) -> str:
145145
return snake_to_camel(self.target_model)
146146

147147

148-
class ModelGenerationMetadata(_Base):
149-
"""Metadata used for code generation."""
150-
148+
class ModelMetadata(_Base):
151149
create_endpoints: bool = True
152150
create_tests: bool = True
153151
create_daos: bool = True
154152
create_dtos: bool = True
155153

154+
is_auth_model: bool = False
155+
156156

157157
class Model(_Base):
158158
"""Represents a model with fields and relationships."""
159159

160160
name: ModelName
161161
fields: list[ModelField]
162162
relationships: list[ModelRelationship] = []
163-
metadata: ModelGenerationMetadata = ModelGenerationMetadata()
163+
metadata: ModelMetadata = ModelMetadata()
164164

165165
@computed_field
166166
@property
@@ -321,6 +321,10 @@ def _validate_models(self) -> Self:
321321
f"'{relationship.target_model}', which does not exist.",
322322
)
323323

324+
if sum(model.metadata.is_auth_model for model in self.models) > 1:
325+
msg = "Only one model can be an auth user."
326+
raise ValueError(msg)
327+
324328
return self
325329

326330
@model_validator(mode="after")

fastapi_forge/example-projects/game_zone.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ project:
3434
metadata:
3535
create_endpoints: false
3636
create_tests: false
37+
is_auth_model: true
3738

3839
- name: user_profile
3940
fields:

fastapi_forge/frontend/components/model_row.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ def __init__(
99
self,
1010
model: Model,
1111
color: str | None = None,
12+
icon: str | None = None,
1213
):
1314
super().__init__(wrap=False)
1415
self.model = model
1516
self.is_selected_row = model == state.selected_model
1617
self.color = color
18+
self.icon = icon
1719
self.is_editing = False
1820
self._build()
1921

@@ -26,7 +28,12 @@ def _build(self) -> None:
2628
base_classes += " hover:bg-gray-100 dark:hover:bg-gray-800"
2729

2830
with self.classes(base_classes):
29-
self.name_label = ui.label(text=self.model.name).classes("self-center")
31+
with ui.row().classes("flex-nowrap gap-2 min-w-fit"):
32+
if self.icon:
33+
ui.icon(self.icon, color="green", size="20px").classes(
34+
"self-center"
35+
)
36+
self.name_label = ui.label(text=self.model.name).classes("self-center")
3037
if self.color:
3138
self.name_label.classes(add=self.color)
3239
self.name_input = (

fastapi_forge/frontend/panels/model_editor_panel.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,8 @@ def _handle_modal_add_relation(
284284
self._refresh_relationship_table(state.selected_model.relationships)
285285

286286
def refresh(self) -> None:
287+
if state.selected_model is None:
288+
return
287289
self._refresh_table(state.selected_model.fields)
288290
self._refresh_relationship_table(state.selected_model.relationships)
289291

fastapi_forge/frontend/panels/model_panel.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,14 @@ def _render_models(self) -> None:
5858

5959
with self.model_list:
6060
for model in state.models:
61-
ModelRow(
61+
mr = ModelRow(
6262
model,
6363
color=(
6464
SELECTED_MODEL_TEXT_COLOR
6565
if model == state.selected_model
6666
else None
6767
),
68+
icon="security" if model.metadata.is_auth_model else None,
6869
)
70+
if model.metadata.is_auth_model:
71+
mr.tooltip("This model is used for Auth.")

fastapi_forge/jinja.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@
22

33
from jinja2 import Environment
44

5-
from fastapi_forge.dtos import Model, ModelField, ModelFieldMetadata, ModelRelationship
5+
from fastapi_forge.dtos import (
6+
Model,
7+
ModelField,
8+
ModelFieldMetadata,
9+
ModelMetadata,
10+
ModelRelationship,
11+
)
612
from fastapi_forge.enums import FieldDataType
713
from fastapi_forge.jinja_utils import generate_field, generate_relationship
814

@@ -444,6 +450,7 @@ def render_model_to_delete_test(model: Model) -> str:
444450
models = [
445451
Model(
446452
name="auth_user",
453+
metadata=ModelMetadata(is_auth_model=True),
447454
fields=[
448455
ModelField(
449456
name="id",

0 commit comments

Comments
 (0)