plain.models 0.45.0__tar.gz → 0.46.0__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.
- {plain_models-0.45.0 → plain_models-0.46.0}/PKG-INFO +1 -1
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/CHANGELOG.md +13 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/base/validation.py +1 -1
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/base.py +0 -1
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/validation.py +16 -16
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/postgresql/base.py +0 -1
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/postgresql/operations.py +1 -2
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/sqlite3/base.py +0 -1
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/base.py +206 -234
- plain_models-0.46.0/plain/models/config.py +16 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/fields/__init__.py +117 -227
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/fields/json.py +22 -22
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/fields/mixins.py +11 -10
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/fields/related.py +131 -119
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/state.py +1 -1
- plain_models-0.46.0/plain/models/preflight.py +221 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/pyproject.toml +1 -1
- plain_models-0.45.0/plain/models/config.py +0 -24
- plain_models-0.45.0/plain/models/preflight.py +0 -214
- {plain_models-0.45.0 → plain_models-0.46.0}/.gitignore +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/LICENSE +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/README.md +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/AGENTS.md +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/README.md +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/aggregates.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/base/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/base/base.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/base/client.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/base/creation.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/base/features.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/base/introspection.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/base/operations.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/base/schema.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/ddl_references.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/client.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/compiler.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/creation.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/features.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/introspection.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/operations.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/mysql/schema.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/postgresql/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/postgresql/client.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/postgresql/creation.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/postgresql/features.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/postgresql/introspection.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/postgresql/schema.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/sqlite3/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/sqlite3/_functions.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/sqlite3/client.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/sqlite3/creation.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/sqlite3/features.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/sqlite3/introspection.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/sqlite3/operations.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/sqlite3/schema.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backends/utils.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backups/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backups/cli.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backups/clients.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/backups/core.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/cli.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/connections.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/constants.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/constraints.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/database_url.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/db.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/default_settings.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/deletion.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/entrypoints.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/enums.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/exceptions.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/expressions.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/fields/related_descriptors.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/fields/related_lookups.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/fields/related_managers.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/fields/reverse_related.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/forms.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/functions/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/functions/comparison.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/functions/datetime.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/functions/math.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/functions/mixins.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/functions/text.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/functions/window.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/indexes.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/lookups.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/autodetector.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/exceptions.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/executor.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/graph.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/loader.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/migration.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/operations/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/operations/base.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/operations/fields.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/operations/models.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/operations/special.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/optimizer.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/questioner.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/recorder.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/serializer.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/utils.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/migrations/writer.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/options.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/otel.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/query.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/query_utils.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/registry.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/sql/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/sql/compiler.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/sql/constants.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/sql/datastructures.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/sql/query.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/sql/subqueries.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/sql/where.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/test/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/test/pytest.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/test/utils.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/transaction.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/plain/models/utils.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/app/examples/migrations/0001_initial.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/app/examples/migrations/0002_test_field_removed.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/app/examples/migrations/0003_deleteparent_childsetnull_childsetdefault_and_more.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/app/examples/migrations/__init__.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/app/examples/models.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/app/settings.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/app/urls.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/test_database_url.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/test_delete_behaviors.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/test_exceptions.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/test_manager_assignment.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/test_models.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/test_related_descriptors.py +0 -0
- {plain_models-0.45.0 → plain_models-0.46.0}/tests/test_related_manager_api.py +0 -0
@@ -1,5 +1,18 @@
|
|
1
1
|
# plain-models changelog
|
2
2
|
|
3
|
+
## [0.46.0](https://github.com/dropseed/plain/releases/plain-models@0.46.0) (2025-09-25)
|
4
|
+
|
5
|
+
### What's changed
|
6
|
+
|
7
|
+
- The preflight system has been completely reworked with a new `PreflightResult` class that unifies messages and hints into a single `fix` field, providing clearer and more actionable error messages ([b0b610d](https://github.com/dropseed/plain/commit/b0b610d461), [c7cde12](https://github.com/dropseed/plain/commit/c7cde12149))
|
8
|
+
- Preflight check IDs have been renamed to use descriptive names instead of numbers for better clarity (e.g., `models.E003` becomes `models.duplicate_many_to_many_relations`) ([cd96c97](https://github.com/dropseed/plain/commit/cd96c97b25))
|
9
|
+
- Removed deprecated field types: `CommaSeparatedIntegerField`, `IPAddressField`, and `NullBooleanField` ([345295dc](https://github.com/dropseed/plain/commit/345295dc8a))
|
10
|
+
- Removed `system_check_deprecated_details` and `system_check_removed_details` from fields ([e3a7d2dd](https://github.com/dropseed/plain/commit/e3a7d2dd10))
|
11
|
+
|
12
|
+
### Upgrade instructions
|
13
|
+
|
14
|
+
- Remove any usage of the deprecated field types `CommaSeparatedIntegerField`, `IPAddressField`, and `NullBooleanField` - use `CharField`, `GenericIPAddressField`, and `BooleanField(null=True)` respectively
|
15
|
+
|
3
16
|
## [0.45.0](https://github.com/dropseed/plain/releases/plain-models@0.45.0) (2025-09-21)
|
4
17
|
|
5
18
|
### What's changed
|
@@ -102,7 +102,6 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
|
102
102
|
"FloatField": "double precision",
|
103
103
|
"IntegerField": "integer",
|
104
104
|
"BigIntegerField": "bigint",
|
105
|
-
"IPAddressField": "char(15)",
|
106
105
|
"GenericIPAddressField": "char(39)",
|
107
106
|
"JSONField": "json",
|
108
107
|
"PositiveBigIntegerField": "bigint UNSIGNED",
|
@@ -3,25 +3,24 @@ from plain.models.backends.base.validation import BaseDatabaseValidation
|
|
3
3
|
|
4
4
|
|
5
5
|
class DatabaseValidation(BaseDatabaseValidation):
|
6
|
-
def
|
7
|
-
issues = super().
|
8
|
-
issues.extend(self._check_sql_mode(
|
6
|
+
def preflight(self):
|
7
|
+
issues = super().preflight()
|
8
|
+
issues.extend(self._check_sql_mode())
|
9
9
|
return issues
|
10
10
|
|
11
|
-
def _check_sql_mode(self
|
11
|
+
def _check_sql_mode(self):
|
12
12
|
if not (
|
13
13
|
self.connection.sql_mode & {"STRICT_TRANS_TABLES", "STRICT_ALL_TABLES"}
|
14
14
|
):
|
15
15
|
return [
|
16
|
-
preflight.
|
17
|
-
f"{self.connection.display_name} Strict Mode is not set for the database connection"
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
id="mysql.W002",
|
16
|
+
preflight.PreflightResult(
|
17
|
+
fix=f"{self.connection.display_name} Strict Mode is not set for the database connection. "
|
18
|
+
f"{self.connection.display_name}'s Strict Mode fixes many data integrity problems in "
|
19
|
+
f"{self.connection.display_name}, such as data truncation upon insertion, by "
|
20
|
+
"escalating warnings into errors. It is strongly "
|
21
|
+
"recommended you activate it.",
|
22
|
+
id="mysql.strict_mode_not_enabled",
|
23
|
+
warning=True,
|
25
24
|
)
|
26
25
|
]
|
27
26
|
return []
|
@@ -40,11 +39,12 @@ class DatabaseValidation(BaseDatabaseValidation):
|
|
40
39
|
and (field.max_length is None or int(field.max_length) > 255)
|
41
40
|
):
|
42
41
|
errors.append(
|
43
|
-
preflight.
|
44
|
-
f"{self.connection.display_name} may not allow unique CharFields to have a max_length "
|
42
|
+
preflight.PreflightResult(
|
43
|
+
fix=f"{self.connection.display_name} may not allow unique CharFields to have a max_length "
|
45
44
|
"> 255.",
|
46
45
|
obj=field,
|
47
|
-
id="mysql.
|
46
|
+
id="mysql.unique_charfield_max_length_too_long",
|
47
|
+
warning=True,
|
48
48
|
)
|
49
49
|
)
|
50
50
|
|
@@ -100,7 +100,6 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
|
100
100
|
"FloatField": "double precision",
|
101
101
|
"IntegerField": "integer",
|
102
102
|
"BigIntegerField": "bigint",
|
103
|
-
"IPAddressField": "inet",
|
104
103
|
"GenericIPAddressField": "inet",
|
105
104
|
"JSONField": "jsonb",
|
106
105
|
"PositiveBigIntegerField": "bigint",
|
@@ -51,7 +51,6 @@ class DatabaseOperations(BaseDatabaseOperations):
|
|
51
51
|
internal_type = output_field.get_internal_type()
|
52
52
|
if internal_type in (
|
53
53
|
"GenericIPAddressField",
|
54
|
-
"IPAddressField",
|
55
54
|
"TimeField",
|
56
55
|
"UUIDField",
|
57
56
|
):
|
@@ -165,7 +164,7 @@ class DatabaseOperations(BaseDatabaseOperations):
|
|
165
164
|
"regex",
|
166
165
|
"iregex",
|
167
166
|
):
|
168
|
-
if internal_type
|
167
|
+
if internal_type == "GenericIPAddressField":
|
169
168
|
lookup = "HOST(%s)"
|
170
169
|
else:
|
171
170
|
lookup = "%s::text"
|
@@ -74,7 +74,6 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
|
74
74
|
"FloatField": "real",
|
75
75
|
"IntegerField": "integer",
|
76
76
|
"BigIntegerField": "bigint",
|
77
|
-
"IPAddressField": "char(15)",
|
78
77
|
"GenericIPAddressField": "char(39)",
|
79
78
|
"JSONField": "text",
|
80
79
|
"PositiveBigIntegerField": "bigint unsigned",
|