crudadmin 0.3.2__tar.gz → 0.3.3__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 (64) hide show
  1. {crudadmin-0.3.2 → crudadmin-0.3.3}/.gitignore +8 -2
  2. {crudadmin-0.3.2 → crudadmin-0.3.3}/PKG-INFO +18 -3
  3. {crudadmin-0.3.2 → crudadmin-0.3.3}/README.md +17 -2
  4. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/admin_site.py +3 -1
  5. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/crud_admin.py +9 -2
  6. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_user/models.py +3 -1
  7. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/core/schemas/timestamp.py +6 -4
  8. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/event/decorators.py +3 -1
  9. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/event/models.py +3 -1
  10. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/event/service.py +3 -1
  11. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/backends/database.py +3 -1
  12. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/backends/memory.py +3 -1
  13. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/manager.py +3 -1
  14. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/models.py +3 -1
  15. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/schemas.py +3 -1
  16. {crudadmin-0.3.2 → crudadmin-0.3.3}/pyproject.toml +1 -1
  17. {crudadmin-0.3.2 → crudadmin-0.3.3}/LICENSE +0 -0
  18. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/__init__.py +0 -0
  19. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/__init__.py +0 -0
  20. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/auth.py +0 -0
  21. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/helper.py +0 -0
  22. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/middleware/__init__.py +0 -0
  23. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/middleware/auth.py +0 -0
  24. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/middleware/https.py +0 -0
  25. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/middleware/ip_restriction.py +0 -0
  26. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/model_view.py +0 -0
  27. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_interface/typing.py +0 -0
  28. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_user/__init__.py +0 -0
  29. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_user/schemas.py +0 -0
  30. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/admin_user/service.py +0 -0
  31. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/core/__init__.py +0 -0
  32. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/core/auth.py +0 -0
  33. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/core/db.py +0 -0
  34. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/core/exceptions.py +0 -0
  35. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/core/rate_limiter.py +0 -0
  36. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/core/schemas/__init__.py +0 -0
  37. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/event/__init__.py +0 -0
  38. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/event/integration.py +0 -0
  39. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/event/schemas.py +0 -0
  40. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/py.typed +0 -0
  41. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/__init__.py +0 -0
  42. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/backends/__init__.py +0 -0
  43. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/backends/hybrid.py +0 -0
  44. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/backends/memcached.py +0 -0
  45. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/backends/redis.py +0 -0
  46. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/storage.py +0 -0
  47. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/session/user_agents_types.py +0 -0
  48. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/static/favicon.png +0 -0
  49. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/static/htmx.min.js +0 -0
  50. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/dashboard/dashboard.html +0 -0
  51. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/dashboard/dashboard_content.html +0 -0
  52. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/management/events.html +0 -0
  53. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/management/events_content.html +0 -0
  54. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/management/health.html +0 -0
  55. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/management/health_content.html +0 -0
  56. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/model/components/list_content.html +0 -0
  57. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/model/components/pagination.html +0 -0
  58. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/model/components/table_content.html +0 -0
  59. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/model/create.html +0 -0
  60. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/model/list.html +0 -0
  61. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/admin/model/update.html +0 -0
  62. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/auth/login.html +0 -0
  63. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/base/base.html +0 -0
  64. {crudadmin-0.3.2 → crudadmin-0.3.3}/crudadmin/templates/shared/utils/refresh.html +0 -0
@@ -61,6 +61,12 @@ local_settings.py
61
61
  db.sqlite3
62
62
  db.sqlite3-journal
63
63
 
64
+ # SQLite databases
65
+ *.db
66
+ *.db-journal*
67
+ *.sqlite
68
+ *.sqlite3
69
+
64
70
  # Flask stuff:
65
71
  instance/
66
72
  .webassets-cache
@@ -167,6 +173,6 @@ cython_debug/
167
173
  .ruff_cache
168
174
 
169
175
  uv.lock
170
- .python-version
171
176
 
172
- local_test
177
+ local_test
178
+ crudadmin_data/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crudadmin
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: FastAPI-based admin interface with authentication, event logging and CRUD operations
5
5
  Project-URL: Homepage, https://github.com/benavlabs/crudadmin
6
6
  Project-URL: Documentation, https://benavlabs.github.io/crudadmin
@@ -115,8 +115,8 @@ Description-Content-Type: text/markdown
115
115
 
116
116
  **Documentation**: [https://benavlabs.github.io/crudadmin/](https://benavlabs.github.io/crudadmin/)
117
117
 
118
- > [!WARNING]
119
- > CRUDAdmin is still experimental. While actively developed and tested, APIs may change between versions. Upgrade with caution in production environments, always carefuly reading the changelog.
118
+ > \[!WARNING\]
119
+ > CRUDAdmin is still experimental. While actively developed and tested, APIs may change between versions. Upgrade with caution in production environments, always carefully reading the changelog.
120
120
 
121
121
  ## Features
122
122
 
@@ -218,6 +218,21 @@ Navigate to `/admin` to access your admin interface with:
218
218
  - Responsive UI with dark/light themes
219
219
  - Built-in security features
220
220
 
221
+ > \[!WARNING\]
222
+ > **Important for SQLite users:** If you're using SQLite databases (which is the default for CRUDAdmin), make sure to add database files to your `.gitignore` to avoid committing sensitive data like admin credentials and session tokens.
223
+ >
224
+ > ```gitignore
225
+ > # SQLite databases - NEVER commit these to version control
226
+ > *.db
227
+ > *.sqlite
228
+ > *.sqlite3
229
+ > crudadmin_data/
230
+ >
231
+ > # Also exclude database journals
232
+ > *.db-journal
233
+ > *.sqlite3-journal
234
+ > ```
235
+
221
236
  ## Session Backends
222
237
 
223
238
  ### Development (Default)
@@ -28,8 +28,8 @@
28
28
 
29
29
  **Documentation**: [https://benavlabs.github.io/crudadmin/](https://benavlabs.github.io/crudadmin/)
30
30
 
31
- > [!WARNING]
32
- > CRUDAdmin is still experimental. While actively developed and tested, APIs may change between versions. Upgrade with caution in production environments, always carefuly reading the changelog.
31
+ > \[!WARNING\]
32
+ > CRUDAdmin is still experimental. While actively developed and tested, APIs may change between versions. Upgrade with caution in production environments, always carefully reading the changelog.
33
33
 
34
34
  ## Features
35
35
 
@@ -131,6 +131,21 @@ Navigate to `/admin` to access your admin interface with:
131
131
  - Responsive UI with dark/light themes
132
132
  - Built-in security features
133
133
 
134
+ > \[!WARNING\]
135
+ > **Important for SQLite users:** If you're using SQLite databases (which is the default for CRUDAdmin), make sure to add database files to your `.gitignore` to avoid committing sensitive data like admin credentials and session tokens.
136
+ >
137
+ > ```gitignore
138
+ > # SQLite databases - NEVER commit these to version control
139
+ > *.db
140
+ > *.sqlite
141
+ > *.sqlite3
142
+ > crudadmin_data/
143
+ >
144
+ > # Also exclude database journals
145
+ > *.db-journal
146
+ > *.sqlite3-journal
147
+ > ```
148
+
134
149
  ## Session Backends
135
150
 
136
151
  ### Development (Default)
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  from collections.abc import AsyncGenerator, Callable
3
- from datetime import UTC, datetime
3
+ from datetime import datetime, timezone
4
4
  from typing import Any, Dict, Optional, cast
5
5
 
6
6
  from fastapi import APIRouter, Cookie, Depends, Request, Response
@@ -19,6 +19,8 @@ from ..session.storage import AbstractSessionStorage, get_session_storage
19
19
  from .auth import AdminAuthentication
20
20
  from .typing import RouteResponse
21
21
 
22
+ UTC = timezone.utc
23
+
22
24
  logger = logging.getLogger(__name__)
23
25
 
24
26
  EndpointCallable = Callable[..., Any]
@@ -1,8 +1,9 @@
1
1
  import logging
2
2
  import os
3
+ import sys
3
4
  import time
4
5
  from collections.abc import Awaitable, Callable
5
- from datetime import UTC, datetime, timedelta
6
+ from datetime import datetime, timedelta, timezone
6
7
  from typing import (
7
8
  Any,
8
9
  AsyncGenerator,
@@ -10,13 +11,17 @@ from typing import (
10
11
  List,
11
12
  Optional,
12
13
  Type,
13
- TypeAlias,
14
14
  TypedDict,
15
15
  TypeVar,
16
16
  Union,
17
17
  cast,
18
18
  )
19
19
 
20
+ if sys.version_info >= (3, 10):
21
+ from typing import TypeAlias
22
+ else:
23
+ from typing_extensions import TypeAlias
24
+
20
25
  from fastapi import APIRouter, Depends, FastAPI, Request
21
26
  from fastapi.security import OAuth2PasswordBearer
22
27
  from fastapi.staticfiles import StaticFiles
@@ -43,6 +48,8 @@ from .admin_site import AdminSite
43
48
  from .model_view import ModelView
44
49
  from .typing import RouteResponse
45
50
 
51
+ UTC = timezone.utc
52
+
46
53
  logger = logging.getLogger("crudadmin")
47
54
 
48
55
  ModelType = TypeVar("ModelType", bound=DeclarativeBase)
@@ -1,9 +1,11 @@
1
- from datetime import UTC, datetime
1
+ from datetime import datetime, timezone
2
2
  from typing import Optional, Type
3
3
 
4
4
  from sqlalchemy import Boolean, DateTime, String
5
5
  from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
6
6
 
7
+ UTC = timezone.utc
8
+
7
9
 
8
10
  def create_admin_user(base: Type[DeclarativeBase]) -> Type[DeclarativeBase]:
9
11
  class AdminUser(base): # type: ignore
@@ -1,23 +1,25 @@
1
- from datetime import UTC, datetime
1
+ from datetime import datetime, timezone
2
2
  from typing import Any, Optional
3
3
 
4
4
  from pydantic import BaseModel, Field, field_serializer
5
5
 
6
+ UTC = timezone.utc
7
+
6
8
 
7
9
  class TimestampSchema(BaseModel):
8
10
  created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
9
11
  updated_at: Optional[datetime] = Field(default=None)
10
12
 
11
13
  @field_serializer("created_at")
12
- def serialize_dt(self, created_at: datetime | None, _info: Any) -> str | None:
14
+ def serialize_dt(self, created_at: Optional[datetime], _info: Any) -> Optional[str]:
13
15
  if created_at is not None:
14
16
  return created_at.isoformat()
15
17
  return None
16
18
 
17
19
  @field_serializer("updated_at")
18
20
  def serialize_updated_at(
19
- self, updated_at: datetime | None, _info: Any
20
- ) -> str | None:
21
+ self, updated_at: Optional[datetime], _info: Any
22
+ ) -> Optional[str]:
21
23
  if updated_at is not None:
22
24
  return updated_at.isoformat()
23
25
  return None
@@ -1,7 +1,7 @@
1
1
  import functools
2
2
  import logging
3
3
  from collections.abc import Callable
4
- from datetime import UTC, datetime
4
+ from datetime import datetime, timezone
5
5
  from typing import Any, Dict, Optional, Type
6
6
 
7
7
  from fastapi import Request
@@ -11,6 +11,8 @@ from sqlalchemy.orm import DeclarativeBase
11
11
 
12
12
  from .models import EventType
13
13
 
14
+ UTC = timezone.utc
15
+
14
16
  logger = logging.getLogger(__name__)
15
17
 
16
18
 
@@ -1,4 +1,4 @@
1
- from datetime import UTC, datetime
1
+ from datetime import datetime, timezone
2
2
  from typing import Any, Optional, cast
3
3
 
4
4
  from sqlalchemy import JSON, DateTime, String
@@ -7,6 +7,8 @@ from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
7
7
 
8
8
  from .schemas import EventStatus, EventType
9
9
 
10
+ UTC = timezone.utc
11
+
10
12
 
11
13
  def create_admin_event_log(base: type[DeclarativeBase]) -> type[DeclarativeBase]:
12
14
  tablename = "admin_event_log"
@@ -1,6 +1,6 @@
1
1
  import json
2
2
  import logging
3
- from datetime import UTC, datetime, timedelta
3
+ from datetime import datetime, timedelta, timezone
4
4
  from decimal import Decimal
5
5
  from enum import Enum
6
6
  from typing import Any, Optional, cast
@@ -19,6 +19,8 @@ from .schemas import (
19
19
  EventType,
20
20
  )
21
21
 
22
+ UTC = timezone.utc
23
+
22
24
  logger = logging.getLogger(__name__)
23
25
 
24
26
 
@@ -6,7 +6,7 @@ dashboard for session management and monitoring.
6
6
  """
7
7
 
8
8
  import logging
9
- from datetime import UTC, datetime
9
+ from datetime import datetime, timezone
10
10
  from typing import Any, Optional, TypeVar
11
11
 
12
12
  from pydantic import BaseModel
@@ -16,6 +16,8 @@ from ...core.db import DatabaseConfig
16
16
  from ..schemas import AdminSessionCreate, AdminSessionUpdate
17
17
  from ..storage import AbstractSessionStorage
18
18
 
19
+ UTC = timezone.utc
20
+
19
21
  T = TypeVar("T", bound=BaseModel)
20
22
  logger = logging.getLogger(__name__)
21
23
 
@@ -1,13 +1,15 @@
1
1
  import json
2
2
  import logging
3
3
  import re
4
- from datetime import UTC, datetime, timedelta
4
+ from datetime import datetime, timedelta, timezone
5
5
  from typing import Optional, Pattern, TypeVar
6
6
 
7
7
  from pydantic import BaseModel
8
8
 
9
9
  from ..storage import AbstractSessionStorage
10
10
 
11
+ UTC = timezone.utc
12
+
11
13
  T = TypeVar("T", bound=BaseModel)
12
14
  logger = logging.getLogger(__name__)
13
15
 
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  import secrets
3
- from datetime import UTC, datetime, timedelta
3
+ from datetime import datetime, timedelta, timezone
4
4
  from typing import Any, Literal, Optional
5
5
 
6
6
  from fastapi import Request, Response
@@ -10,6 +10,8 @@ from .schemas import CSRFToken, SessionCreate, SessionData, UserAgentInfo
10
10
  from .storage import AbstractSessionStorage, get_session_storage
11
11
  from .user_agents_types import parse
12
12
 
13
+ UTC = timezone.utc
14
+
13
15
  logger = logging.getLogger(__name__)
14
16
 
15
17
  SamesiteType = Literal["lax", "strict", "none"]
@@ -1,9 +1,11 @@
1
- from datetime import UTC, datetime
1
+ from datetime import datetime, timezone
2
2
  from typing import Any
3
3
 
4
4
  from sqlalchemy import JSON, Boolean, DateTime, String
5
5
  from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
6
6
 
7
+ UTC = timezone.utc
8
+
7
9
 
8
10
  def create_admin_session_model(base: type[DeclarativeBase]) -> type[DeclarativeBase]:
9
11
  class AdminSession(base): # type: ignore
@@ -1,4 +1,4 @@
1
- from datetime import UTC, datetime
1
+ from datetime import datetime, timezone
2
2
  from enum import Enum
3
3
  from typing import Any, Optional
4
4
  from uuid import uuid4
@@ -7,6 +7,8 @@ from pydantic import BaseModel, Field, field_validator
7
7
 
8
8
  from ..core.schemas.timestamp import TimestampSchema
9
9
 
10
+ UTC = timezone.utc
11
+
10
12
 
11
13
  class DeviceType(str, Enum):
12
14
  """Device type enumeration"""
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "crudadmin"
3
- version = "0.3.2"
3
+ version = "0.3.3"
4
4
  description = "FastAPI-based admin interface with authentication, event logging and CRUD operations"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9.2"
File without changes
File without changes