tina4-python 3.11.13__tar.gz → 3.11.16__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.
- {tina4_python-3.11.13 → tina4_python-3.11.16}/PKG-INFO +1 -1
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/__init__.py +1 -1
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/firebird.py +10 -2
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/postgres.py +10 -2
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/dev_admin/__init__.py +747 -0
- tina4_python-3.11.16/tina4_python/dev_admin/plan.py +454 -0
- tina4_python-3.11.16/tina4_python/dev_admin/project_index.py +417 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/mcp/__init__.py +19 -0
- tina4_python-3.11.16/tina4_python/mcp/tools.py +742 -0
- tina4_python-3.11.16/tina4_python/public/js/tina4-dev-admin.js +1279 -0
- tina4_python-3.11.16/tina4_python/public/js/tina4-dev-admin.min.js +1279 -0
- tina4_python-3.11.13/tina4_python/mcp/tools.py +0 -348
- tina4_python-3.11.13/tina4_python/public/js/tina4-dev-admin.js +0 -565
- tina4_python-3.11.13/tina4_python/public/js/tina4-dev-admin.min.js +0 -565
- {tina4_python-3.11.13 → tina4_python-3.11.16}/.gitignore +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/README.md +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/pyproject.toml +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/CLAUDE.md +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/HtmlElement.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/Testing.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/ai/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/api/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/auth/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/cache/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/cli/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/container/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/cache.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/constants.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/events.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/middleware.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/rate_limiter.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/request.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/response.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/router.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/core/server.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/crud/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/adapter.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/connection.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/mongodb.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/mssql.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/mysql.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/odbc.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/database/sqlite.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/debug/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/debug/error_overlay.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/dev_admin/metrics.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/dotenv/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/frond/FROND.md +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/frond/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/frond/engine.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/auth/meta.json +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/auth/src/routes/api/gallery_auth.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/database/meta.json +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/database/src/routes/api/gallery_db.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/error-overlay/meta.json +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/error-overlay/src/routes/api/gallery_crash.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/orm/meta.json +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/orm/src/orm/Product.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/orm/src/routes/api/gallery_products.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/queue/meta.json +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/queue/src/routes/api/gallery_queue.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/rest-api/meta.json +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/rest-api/src/routes/api/gallery_hello.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/templates/meta.json +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/templates/src/routes/gallery_page.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/gallery/templates/src/templates/gallery_page.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/graphql/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/i18n/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/mcp/protocol.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/messenger/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/migration/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/migration/runner.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/orm/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/orm/fields.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/orm/model.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/css/tina4.css +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/css/tina4.min.css +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/favicon.ico +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/images/logo.svg +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/images/tina4-logo-icon.webp +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/js/frond.min.js +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/js/tina4.min.js +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/js/tina4js.min.js +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/swagger/index.html +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/query_builder/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue/job.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue/kafka_backend.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue/lite_backend.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue/mongo_backend.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue/rabbitmq_backend.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue_backends/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue_backends/kafka_backend.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue_backends/mongo_backend.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/queue_backends/rabbitmq_backend.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_alerts.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_badges.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_buttons.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_cards.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_forms.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_grid.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_modals.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_nav.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_reset.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_tables.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_typography.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_utilities.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/_variables.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/base.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/colors.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/scss/tina4css/tina4.scss +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/seeder/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/service/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/session/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/session_handlers/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/session_handlers/mongodb_handler.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/session_handlers/redis_handler.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/session_handlers/valkey_handler.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/swagger/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/components/crud.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/docker/distroless/Dockerfile +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/docker/poetry/Dockerfile +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/docker/python/Dockerfile +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/docker/uv/Dockerfile +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/errors/302.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/errors/401.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/errors/403.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/errors/404.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/errors/500.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/errors/502.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/errors/503.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/errors/base.twig +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/frontend/README.md +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/templates/readme.md +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/test_client/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/af/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/af/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/es/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/es/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/ja/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/ja/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/zh/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/translations/zh/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/validator/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/websocket/__init__.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/websocket/backplane.py +0 -0
- {tina4_python-3.11.13 → tina4_python-3.11.16}/tina4_python/wsdl/__init__.py +0 -0
|
@@ -158,7 +158,7 @@ class FirebirdAdapter(DatabaseAdapter):
|
|
|
158
158
|
|
|
159
159
|
desc = cursor.description
|
|
160
160
|
col_names = [d[0].strip().lower() for d in desc] if desc else []
|
|
161
|
-
rows = [dict(zip(col_names, row)) for row in cursor.fetchall()]
|
|
161
|
+
rows = [self._decode_blobs(dict(zip(col_names, row))) for row in cursor.fetchall()]
|
|
162
162
|
|
|
163
163
|
return DatabaseResult(records=rows, count=total, limit=limit, offset=offset, sql=sql, adapter=self)
|
|
164
164
|
|
|
@@ -171,7 +171,15 @@ class FirebirdAdapter(DatabaseAdapter):
|
|
|
171
171
|
if row is None:
|
|
172
172
|
return None
|
|
173
173
|
col_names = [d[0].strip().lower() for d in desc] if desc else []
|
|
174
|
-
return dict(zip(col_names, row))
|
|
174
|
+
return self._decode_blobs(dict(zip(col_names, row)))
|
|
175
|
+
|
|
176
|
+
@staticmethod
|
|
177
|
+
def _decode_blobs(row: dict) -> dict:
|
|
178
|
+
"""Ensure Firebird BLOB columns are proper bytes, not memoryview."""
|
|
179
|
+
for key, value in row.items():
|
|
180
|
+
if isinstance(value, memoryview):
|
|
181
|
+
row[key] = bytes(value)
|
|
182
|
+
return row
|
|
175
183
|
|
|
176
184
|
def insert(self, table: str, data: dict) -> DatabaseResult:
|
|
177
185
|
columns = ", ".join(data.keys())
|
|
@@ -119,7 +119,7 @@ class PostgreSQLAdapter(DatabaseAdapter):
|
|
|
119
119
|
paginated_sql = f"{sql} LIMIT %s OFFSET %s"
|
|
120
120
|
paginated_params = (params or []) + [limit, offset]
|
|
121
121
|
cursor.execute(paginated_sql, paginated_params)
|
|
122
|
-
rows = [dict(row) for row in cursor.fetchall()]
|
|
122
|
+
rows = [self._decode_blobs(dict(row)) for row in cursor.fetchall()]
|
|
123
123
|
|
|
124
124
|
return DatabaseResult(records=rows, count=total, limit=limit, offset=offset, sql=sql, adapter=self)
|
|
125
125
|
|
|
@@ -130,7 +130,15 @@ class PostgreSQLAdapter(DatabaseAdapter):
|
|
|
130
130
|
cursor = self._conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
|
|
131
131
|
cursor.execute(sql, params or [])
|
|
132
132
|
row = cursor.fetchone()
|
|
133
|
-
return dict(row) if row else None
|
|
133
|
+
return self._decode_blobs(dict(row)) if row else None
|
|
134
|
+
|
|
135
|
+
@staticmethod
|
|
136
|
+
def _decode_blobs(row: dict) -> dict:
|
|
137
|
+
"""Ensure binary columns (bytea) are proper bytes, not memoryview."""
|
|
138
|
+
for key, value in row.items():
|
|
139
|
+
if isinstance(value, memoryview):
|
|
140
|
+
row[key] = bytes(value)
|
|
141
|
+
return row
|
|
134
142
|
|
|
135
143
|
def insert(self, table: str, data: dict) -> DatabaseResult:
|
|
136
144
|
columns = ", ".join(data.keys())
|