skrift 0.1.0a8__tar.gz → 0.1.0a9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {skrift-0.1.0a8 → skrift-0.1.0a9}/PKG-INFO +1 -1
- {skrift-0.1.0a8 → skrift-0.1.0a9}/pyproject.toml +1 -1
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260129_add_oauth_accounts.py +9 -2
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/auth/roles.py +36 -1
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/static/css/style.css +5 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/.gitignore +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/README.md +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/__init__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/__main__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/admin/__init__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/admin/controller.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/admin/navigation.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/env.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/script.py.mako +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260120_210154_09b0364dbb7b_initial_schema.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260122_152744_0b7c927d2591_add_roles_and_permissions.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260122_172836_cdf734a5b847_add_sa_orm_sentinel_column.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260122_175637_a9c55348eae7_remove_page_type_column.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260122_200000_add_settings_table.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260129_add_provider_metadata.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic.ini +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/asgi.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/auth/__init__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/auth/guards.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/auth/services.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/cli.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/config.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/controllers/__init__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/controllers/auth.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/controllers/web.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/__init__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/base.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/__init__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/oauth_account.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/page.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/role.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/setting.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/user.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/services/__init__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/services/oauth_service.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/services/page_service.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/services/setting_service.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/lib/__init__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/lib/exceptions.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/lib/template.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/__init__.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/config_writer.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/controller.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/middleware.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/providers.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/state.py +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/admin.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/base.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/pages/edit.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/pages/list.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/settings/site.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/users/list.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/users/roles.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/auth/dummy_login.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/auth/login.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/base.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/error-404.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/error-500.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/error.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/index.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/page.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/admin.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/auth.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/base.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/complete.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/configuring.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/database.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/restart.html +0 -0
- {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/site.html +0 -0
|
@@ -63,10 +63,17 @@ def upgrade() -> None:
|
|
|
63
63
|
# Step 2: Migrate existing data from users to oauth_accounts
|
|
64
64
|
# Generate binary UUIDs (16 bytes) for new records and copy oauth data
|
|
65
65
|
conn = op.get_bind()
|
|
66
|
-
conn.
|
|
66
|
+
dialect = conn.dialect.name
|
|
67
|
+
|
|
68
|
+
if dialect == 'sqlite':
|
|
69
|
+
uuid_func = 'randomblob(16)'
|
|
70
|
+
else: # PostgreSQL and others
|
|
71
|
+
uuid_func = 'gen_random_uuid()'
|
|
72
|
+
|
|
73
|
+
conn.execute(sa.text(f"""
|
|
67
74
|
INSERT INTO oauth_accounts (id, created_at, updated_at, provider, provider_account_id, provider_email, user_id)
|
|
68
75
|
SELECT
|
|
69
|
-
|
|
76
|
+
{uuid_func},
|
|
70
77
|
created_at,
|
|
71
78
|
updated_at,
|
|
72
79
|
oauth_provider,
|
|
@@ -86,9 +86,44 @@ def get_role_definition(name: str) -> RoleDefinition | None:
|
|
|
86
86
|
return ROLE_DEFINITIONS.get(name)
|
|
87
87
|
|
|
88
88
|
|
|
89
|
-
def register_role(
|
|
89
|
+
def register_role(
|
|
90
|
+
name: str,
|
|
91
|
+
*permissions: str,
|
|
92
|
+
display_name: str | None = None,
|
|
93
|
+
description: str | None = None,
|
|
94
|
+
) -> RoleDefinition:
|
|
90
95
|
"""Register a custom role definition.
|
|
91
96
|
|
|
92
97
|
This allows applications to add custom roles beyond the defaults.
|
|
98
|
+
Call this during application startup (e.g., in a custom controller module
|
|
99
|
+
or app initialization) before the database sync occurs.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
name: The unique identifier for the role
|
|
103
|
+
*permissions: Permission strings granted by this role
|
|
104
|
+
display_name: Human-readable name for the role
|
|
105
|
+
description: Description of the role's purpose
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
The registered RoleDefinition instance
|
|
109
|
+
|
|
110
|
+
Example:
|
|
111
|
+
from skrift.auth.roles import register_role
|
|
112
|
+
|
|
113
|
+
# Register a custom role with permissions
|
|
114
|
+
register_role(
|
|
115
|
+
"support",
|
|
116
|
+
"view-tickets",
|
|
117
|
+
"respond-tickets",
|
|
118
|
+
display_name="Support Agent",
|
|
119
|
+
description="Can view and respond to support tickets",
|
|
120
|
+
)
|
|
93
121
|
"""
|
|
122
|
+
role = create_role(
|
|
123
|
+
name,
|
|
124
|
+
*permissions,
|
|
125
|
+
display_name=display_name,
|
|
126
|
+
description=description,
|
|
127
|
+
)
|
|
94
128
|
ROLE_DEFINITIONS[role.name] = role
|
|
129
|
+
return role
|
|
@@ -791,6 +791,11 @@ main.container.admin-layout {
|
|
|
791
791
|
color: var(--color-primary-text);
|
|
792
792
|
}
|
|
793
793
|
|
|
794
|
+
.admin-nav a.active:hover {
|
|
795
|
+
background-color: var(--color-primary-hover);
|
|
796
|
+
color: var(--color-primary-text);
|
|
797
|
+
}
|
|
798
|
+
|
|
794
799
|
.admin-nav a::after {
|
|
795
800
|
display: none;
|
|
796
801
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260122_200000_add_settings_table.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|