|
22 | 22 | BooleanField, |
23 | 23 | DateTimeField, |
24 | 24 | EmailField, |
| 25 | + EnumField, |
25 | 26 | HasOne, |
26 | 27 | IntegerField, |
27 | 28 | JSONField, |
|
36 | 37 | from divbase_api.db import get_db |
37 | 38 | from divbase_api.deps import _authenticate_frontend_user_from_tokens |
38 | 39 | from divbase_api.frontend_routes.auth import get_login, post_logout |
| 40 | +from divbase_api.models.announcements import AnnouncementDB, AnnouncementLevel, AnnouncementTarget |
39 | 41 | from divbase_api.models.project_versions import ProjectVersionDB |
40 | | -from divbase_api.models.projects import ProjectDB, ProjectMembershipDB |
41 | | -from divbase_api.models.revoked_tokens import RevokedTokenDB |
| 42 | +from divbase_api.models.projects import ProjectDB, ProjectMembershipDB, ProjectRoles |
| 43 | +from divbase_api.models.revoked_tokens import RevokedTokenDB, TokenRevokeReason |
42 | 44 | from divbase_api.models.task_history import CeleryTaskMeta, TaskHistoryDB, TaskStartedAtDB |
43 | 45 | from divbase_api.models.users import UserDB |
44 | | -from divbase_api.security import get_password_hash |
| 46 | +from divbase_api.security import TokenType, get_password_hash |
45 | 47 |
|
46 | 48 | logger = logging.getLogger(__name__) |
47 | 49 |
|
@@ -275,7 +277,7 @@ class ProjectMembershipView(ModelView): |
275 | 277 | IntegerField("id", label="ID", disabled=True), |
276 | 278 | HasOne("user", identity="user", label="User"), |
277 | 279 | HasOne("project", identity="project", label="Project"), |
278 | | - StringField("role", label="Role", required=True), |
| 280 | + EnumField("role", label="Role", required=True, enum=ProjectRoles), |
279 | 281 | DateTimeField("created_at", label="Created At", disabled=True), |
280 | 282 | DateTimeField("updated_at", label="Updated At", disabled=True), |
281 | 283 | ] |
@@ -377,9 +379,9 @@ class RevokedTokenView(ModelView): |
377 | 379 | fields = [ |
378 | 380 | IntegerField("id", label="ID", disabled=True), |
379 | 381 | StringField("token_jti", label="Token JTI", required=True), |
380 | | - StringField("token_type", label="Token Type", required=True), |
| 382 | + EnumField("token_type", label="Token Type", required=True, enum=TokenType), |
381 | 383 | DateTimeField("revoked_at", label="Revoked At", disabled=True), |
382 | | - StringField("revoked_reason", label="Revoked Reason", required=True), |
| 384 | + EnumField("revoked_reason", label="Revoke Reason", required=True, enum=TokenRevokeReason), |
383 | 385 | IntegerField("user_id", label="User ID", required=False), |
384 | 386 | HasOne("user", identity="user", label="User"), |
385 | 387 | DateTimeField("created_at", label="Created At", disabled=True), |
@@ -567,6 +569,37 @@ def can_delete(self, request: Request) -> bool: |
567 | 569 | return False |
568 | 570 |
|
569 | 571 |
|
| 572 | +class AnnouncementView(ModelView): |
| 573 | + """ |
| 574 | + Custom admin panel View for the AnnouncementDB model. |
| 575 | + """ |
| 576 | + |
| 577 | + page_size_options = PAGINATION_DEFAULTS |
| 578 | + fields = [ |
| 579 | + IntegerField("id", label="ID", disabled=True), |
| 580 | + StringField("heading", label="Heading", required=True), |
| 581 | + TextAreaField("message", label="Message", required=False), |
| 582 | + EnumField("target", label="Target", required=True, enum=AnnouncementTarget), |
| 583 | + EnumField("level", label="Level", required=True, enum=AnnouncementLevel), |
| 584 | + DateTimeField( |
| 585 | + "auto_expire_at", |
| 586 | + help_text="Optional timestamp when the announcement will auto expire. After this timestamp the announcement will no longer be displayed on the frontend or CLI. Value can be left empty.", |
| 587 | + ), |
| 588 | + DateTimeField( |
| 589 | + "created_at", help_text="Timestamp when the entry was created. Value determined by system.", disabled=True |
| 590 | + ), |
| 591 | + DateTimeField( |
| 592 | + "updated_at", |
| 593 | + help_text="Timestamp when the entry was last updated. Value determined by system.", |
| 594 | + disabled=True, |
| 595 | + ), |
| 596 | + ] |
| 597 | + |
| 598 | + exclude_fields_from_list = ["message"] |
| 599 | + exclude_fields_from_edit = ["id", "created_at", "updated_at"] |
| 600 | + exclude_fields_from_detail = [] |
| 601 | + |
| 602 | + |
570 | 603 | class DivBaseAuthProvider(AuthProvider): |
571 | 604 | """ |
572 | 605 | This class enables starlette-admin to make use of DivBase's pre-existing auth system. |
@@ -646,6 +679,8 @@ def register_admin_panel(app: FastAPI, engine: AsyncEngine) -> None: |
646 | 679 | admin.add_view( |
647 | 680 | CeleryTaskMetaView(CeleryTaskMeta, icon="fas fa-tasks", label="Celery Task Meta", identity="celery-meta") |
648 | 681 | ) |
649 | | - |
650 | 682 | admin.add_view(TaskStartedAtView(TaskStartedAtDB, icon="fas fa-clock", label="Task Started At")) |
| 683 | + admin.add_view( |
| 684 | + AnnouncementView(AnnouncementDB, icon="fas fa-bullhorn", label="Announcements", identity="announcement") |
| 685 | + ) |
651 | 686 | admin.mount_to(app) |
0 commit comments