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.
Files changed (74) hide show
  1. {skrift-0.1.0a8 → skrift-0.1.0a9}/PKG-INFO +1 -1
  2. {skrift-0.1.0a8 → skrift-0.1.0a9}/pyproject.toml +1 -1
  3. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260129_add_oauth_accounts.py +9 -2
  4. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/auth/roles.py +36 -1
  5. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/static/css/style.css +5 -0
  6. {skrift-0.1.0a8 → skrift-0.1.0a9}/.gitignore +0 -0
  7. {skrift-0.1.0a8 → skrift-0.1.0a9}/README.md +0 -0
  8. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/__init__.py +0 -0
  9. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/__main__.py +0 -0
  10. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/admin/__init__.py +0 -0
  11. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/admin/controller.py +0 -0
  12. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/admin/navigation.py +0 -0
  13. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/env.py +0 -0
  14. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/script.py.mako +0 -0
  15. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260120_210154_09b0364dbb7b_initial_schema.py +0 -0
  16. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260122_152744_0b7c927d2591_add_roles_and_permissions.py +0 -0
  17. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260122_172836_cdf734a5b847_add_sa_orm_sentinel_column.py +0 -0
  18. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260122_175637_a9c55348eae7_remove_page_type_column.py +0 -0
  19. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260122_200000_add_settings_table.py +0 -0
  20. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic/versions/20260129_add_provider_metadata.py +0 -0
  21. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/alembic.ini +0 -0
  22. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/asgi.py +0 -0
  23. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/auth/__init__.py +0 -0
  24. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/auth/guards.py +0 -0
  25. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/auth/services.py +0 -0
  26. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/cli.py +0 -0
  27. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/config.py +0 -0
  28. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/controllers/__init__.py +0 -0
  29. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/controllers/auth.py +0 -0
  30. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/controllers/web.py +0 -0
  31. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/__init__.py +0 -0
  32. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/base.py +0 -0
  33. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/__init__.py +0 -0
  34. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/oauth_account.py +0 -0
  35. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/page.py +0 -0
  36. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/role.py +0 -0
  37. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/setting.py +0 -0
  38. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/models/user.py +0 -0
  39. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/services/__init__.py +0 -0
  40. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/services/oauth_service.py +0 -0
  41. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/services/page_service.py +0 -0
  42. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/db/services/setting_service.py +0 -0
  43. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/lib/__init__.py +0 -0
  44. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/lib/exceptions.py +0 -0
  45. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/lib/template.py +0 -0
  46. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/__init__.py +0 -0
  47. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/config_writer.py +0 -0
  48. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/controller.py +0 -0
  49. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/middleware.py +0 -0
  50. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/providers.py +0 -0
  51. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/setup/state.py +0 -0
  52. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/admin.html +0 -0
  53. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/base.html +0 -0
  54. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/pages/edit.html +0 -0
  55. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/pages/list.html +0 -0
  56. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/settings/site.html +0 -0
  57. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/users/list.html +0 -0
  58. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/admin/users/roles.html +0 -0
  59. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/auth/dummy_login.html +0 -0
  60. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/auth/login.html +0 -0
  61. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/base.html +0 -0
  62. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/error-404.html +0 -0
  63. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/error-500.html +0 -0
  64. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/error.html +0 -0
  65. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/index.html +0 -0
  66. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/page.html +0 -0
  67. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/admin.html +0 -0
  68. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/auth.html +0 -0
  69. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/base.html +0 -0
  70. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/complete.html +0 -0
  71. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/configuring.html +0 -0
  72. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/database.html +0 -0
  73. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/restart.html +0 -0
  74. {skrift-0.1.0a8 → skrift-0.1.0a9}/skrift/templates/setup/site.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skrift
3
- Version: 0.1.0a8
3
+ Version: 0.1.0a9
4
4
  Summary: A lightweight async Python CMS for crafting modern websites
5
5
  Requires-Python: >=3.13
6
6
  Requires-Dist: advanced-alchemy>=0.26.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "skrift"
3
- version = "0.1.0a8"
3
+ version = "0.1.0a9"
4
4
  description = "A lightweight async Python CMS for crafting modern websites"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -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.execute(sa.text("""
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
- randomblob(16),
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(role: RoleDefinition) -> None:
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