plain.models 0.45.0__py3-none-any.whl → 0.46.1__py3-none-any.whl
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/CHANGELOG.md +23 -0
- plain/models/backends/base/validation.py +1 -1
- plain/models/backends/mysql/base.py +0 -1
- plain/models/backends/mysql/validation.py +16 -16
- plain/models/backends/postgresql/base.py +0 -1
- plain/models/backends/postgresql/operations.py +1 -2
- plain/models/backends/sqlite3/base.py +0 -1
- plain/models/base.py +206 -234
- plain/models/config.py +1 -9
- plain/models/fields/__init__.py +117 -227
- plain/models/fields/json.py +22 -22
- plain/models/fields/mixins.py +11 -10
- plain/models/fields/related.py +131 -119
- plain/models/migrations/state.py +1 -1
- plain/models/preflight.py +105 -98
- plain/models/query.py +9 -1
- {plain_models-0.45.0.dist-info → plain_models-0.46.1.dist-info}/METADATA +1 -1
- {plain_models-0.45.0.dist-info → plain_models-0.46.1.dist-info}/RECORD +21 -21
- {plain_models-0.45.0.dist-info → plain_models-0.46.1.dist-info}/WHEEL +0 -0
- {plain_models-0.45.0.dist-info → plain_models-0.46.1.dist-info}/entry_points.txt +0 -0
- {plain_models-0.45.0.dist-info → plain_models-0.46.1.dist-info}/licenses/LICENSE +0 -0
plain/models/preflight.py
CHANGED
@@ -1,88 +1,87 @@
|
|
1
1
|
import inspect
|
2
2
|
from collections import defaultdict
|
3
|
-
from itertools import chain
|
4
3
|
|
4
|
+
from plain.models.db import db_connection
|
5
5
|
from plain.models.registry import models_registry
|
6
6
|
from plain.packages import packages_registry
|
7
|
-
from plain.preflight import
|
7
|
+
from plain.preflight import PreflightCheck, PreflightResult, register_check
|
8
8
|
|
9
9
|
|
10
|
-
@register_check
|
11
|
-
|
12
|
-
|
13
|
-
return []
|
10
|
+
@register_check("models.database_backends")
|
11
|
+
class CheckDatabaseBackends(PreflightCheck):
|
12
|
+
"""Validates database backend configuration when plain.models is available."""
|
14
13
|
|
15
|
-
|
14
|
+
def run(self):
|
15
|
+
return db_connection.validation.preflight()
|
16
16
|
|
17
|
-
return db_connection.validation.check(**kwargs)
|
18
17
|
|
18
|
+
@register_check("models.all_models")
|
19
|
+
class CheckAllModels(PreflightCheck):
|
20
|
+
"""Validates all model definitions for common issues."""
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
errors = []
|
26
|
-
if package_configs is None:
|
22
|
+
def run(self):
|
23
|
+
db_table_models = defaultdict(list)
|
24
|
+
indexes = defaultdict(list)
|
25
|
+
constraints = defaultdict(list)
|
26
|
+
errors = []
|
27
27
|
models = models_registry.get_models()
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
Error(
|
38
|
-
f"The '{model.__name__}.check()' class method is currently overridden by {model.check!r}.",
|
39
|
-
obj=model,
|
40
|
-
id="models.E020",
|
28
|
+
for model in models:
|
29
|
+
db_table_models[model._meta.db_table].append(model._meta.label)
|
30
|
+
if not inspect.ismethod(model.preflight):
|
31
|
+
errors.append(
|
32
|
+
PreflightResult(
|
33
|
+
fix=f"The '{model.__name__}.preflight()' class method is currently overridden by {model.preflight!r}.",
|
34
|
+
obj=model,
|
35
|
+
id="models.preflight_method_overridden",
|
36
|
+
)
|
41
37
|
)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
38
|
+
else:
|
39
|
+
errors.extend(model.preflight())
|
40
|
+
for model_index in model._meta.indexes:
|
41
|
+
indexes[model_index.name].append(model._meta.label)
|
42
|
+
for model_constraint in model._meta.constraints:
|
43
|
+
constraints[model_constraint.name].append(model._meta.label)
|
44
|
+
for db_table, model_labels in db_table_models.items():
|
45
|
+
if len(model_labels) != 1:
|
46
|
+
model_labels_str = ", ".join(model_labels)
|
47
|
+
errors.append(
|
48
|
+
PreflightResult(
|
49
|
+
fix=f"db_table '{db_table}' is used by multiple models: {model_labels_str}.",
|
50
|
+
obj=db_table,
|
51
|
+
id="models.duplicate_db_table",
|
52
|
+
)
|
57
53
|
)
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
54
|
+
for index_name, model_labels in indexes.items():
|
55
|
+
if len(model_labels) > 1:
|
56
|
+
model_labels = set(model_labels)
|
57
|
+
errors.append(
|
58
|
+
PreflightResult(
|
59
|
+
fix="index name '{}' is not unique {} {}.".format(
|
60
|
+
index_name,
|
61
|
+
"for model" if len(model_labels) == 1 else "among models:",
|
62
|
+
", ".join(sorted(model_labels)),
|
63
|
+
),
|
64
|
+
id="models.index_name_not_unique_single"
|
65
|
+
if len(model_labels) == 1
|
66
|
+
else "models.index_name_not_unique_multiple",
|
68
67
|
),
|
69
|
-
|
70
|
-
|
71
|
-
)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
"
|
68
|
+
)
|
69
|
+
for constraint_name, model_labels in constraints.items():
|
70
|
+
if len(model_labels) > 1:
|
71
|
+
model_labels = set(model_labels)
|
72
|
+
errors.append(
|
73
|
+
PreflightResult(
|
74
|
+
fix="constraint name '{}' is not unique {} {}.".format(
|
75
|
+
constraint_name,
|
76
|
+
"for model" if len(model_labels) == 1 else "among models:",
|
77
|
+
", ".join(sorted(model_labels)),
|
78
|
+
),
|
79
|
+
id="models.constraint_name_not_unique_single"
|
80
|
+
if len(model_labels) == 1
|
81
|
+
else "models.constraint_name_not_unique_multiple",
|
81
82
|
),
|
82
|
-
|
83
|
-
|
84
|
-
)
|
85
|
-
return errors
|
83
|
+
)
|
84
|
+
return errors
|
86
85
|
|
87
86
|
|
88
87
|
def _check_lazy_references(models_registry, packages_registry):
|
@@ -140,7 +139,11 @@ def _check_lazy_references(models_registry, packages_registry):
|
|
140
139
|
"field": keywords["field"],
|
141
140
|
"model_error": app_model_error(model_key),
|
142
141
|
}
|
143
|
-
return
|
142
|
+
return PreflightResult(
|
143
|
+
fix=error_msg % params,
|
144
|
+
obj=keywords["field"],
|
145
|
+
id="fields.lazy_reference_not_resolvable",
|
146
|
+
)
|
144
147
|
|
145
148
|
def default_error(model_key, func, args, keywords):
|
146
149
|
error_msg = (
|
@@ -151,7 +154,11 @@ def _check_lazy_references(models_registry, packages_registry):
|
|
151
154
|
"model": ".".join(model_key),
|
152
155
|
"model_error": app_model_error(model_key),
|
153
156
|
}
|
154
|
-
return
|
157
|
+
return PreflightResult(
|
158
|
+
fix=error_msg % params,
|
159
|
+
obj=func,
|
160
|
+
id="models.lazy_reference_resolution_failed",
|
161
|
+
)
|
155
162
|
|
156
163
|
# Maps common uses of lazy operations to corresponding error functions
|
157
164
|
# defined above. If a key maps to None, no error will be produced.
|
@@ -174,41 +181,41 @@ def _check_lazy_references(models_registry, packages_registry):
|
|
174
181
|
for func in models_registry._pending_operations[model_key]
|
175
182
|
),
|
176
183
|
),
|
177
|
-
key=lambda error: error.
|
184
|
+
key=lambda error: error.message,
|
178
185
|
)
|
179
186
|
|
180
187
|
|
181
|
-
@register_check
|
182
|
-
|
183
|
-
|
188
|
+
@register_check("models.lazy_references")
|
189
|
+
class CheckLazyReferences(PreflightCheck):
|
190
|
+
"""Ensures all lazy (string) model references have been resolved."""
|
184
191
|
|
192
|
+
def run(self):
|
193
|
+
return _check_lazy_references(models_registry, packages_registry)
|
185
194
|
|
186
|
-
@register_check
|
187
|
-
def check_database_tables(package_configs, **kwargs):
|
188
|
-
from plain.models.db import db_connection
|
189
195
|
|
190
|
-
|
191
|
-
|
196
|
+
@register_check("models.database_tables")
|
197
|
+
class CheckDatabaseTables(PreflightCheck):
|
198
|
+
"""Checks for unknown tables in the database when plain.models is available."""
|
192
199
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
200
|
+
def run(self):
|
201
|
+
errors = []
|
202
|
+
|
203
|
+
db_tables = db_connection.introspection.table_names()
|
204
|
+
model_tables = db_connection.introspection.plain_table_names()
|
205
|
+
unknown_tables = set(db_tables) - set(model_tables)
|
206
|
+
unknown_tables.discard("plainmigrations") # Know this could be there
|
207
|
+
if unknown_tables:
|
208
|
+
table_names = ", ".join(unknown_tables)
|
209
|
+
specific_fix = f'echo "DROP TABLE IF EXISTS {unknown_tables.pop()}" | plain models db-shell'
|
210
|
+
errors.append(
|
211
|
+
PreflightResult(
|
212
|
+
fix=f"Unknown tables in default database: {table_names}. "
|
206
213
|
"Tables may be from packages/models that have been uninstalled. "
|
207
214
|
"Make sure you have a backup and delete the tables manually "
|
208
|
-
f"(ex. `{
|
209
|
-
|
210
|
-
|
215
|
+
f"(ex. `{specific_fix}`).",
|
216
|
+
id="models.unknown_database_tables",
|
217
|
+
warning=True,
|
218
|
+
)
|
211
219
|
)
|
212
|
-
)
|
213
220
|
|
214
|
-
|
221
|
+
return errors
|
plain/models/query.py
CHANGED
@@ -2204,7 +2204,15 @@ def prefetch_one_level(instances, prefetcher, lookup, level):
|
|
2204
2204
|
if leaf and lookup.queryset is not None:
|
2205
2205
|
qs = queryset._apply_rel_filters(lookup.queryset)
|
2206
2206
|
else:
|
2207
|
-
|
2207
|
+
# Check if queryset is a QuerySet or a related manager
|
2208
|
+
# We need a QuerySet instance to cache the prefetched values
|
2209
|
+
if isinstance(queryset, QuerySet):
|
2210
|
+
# It's already a QuerySet, create a new instance
|
2211
|
+
qs = queryset.__class__(model=queryset.model)
|
2212
|
+
else:
|
2213
|
+
# It's a related manager, get its QuerySet
|
2214
|
+
# The manager's query property returns a properly filtered QuerySet
|
2215
|
+
qs = queryset.query
|
2208
2216
|
qs._result_cache = vals
|
2209
2217
|
# We don't want the individual qs doing prefetch_related now,
|
2210
2218
|
# since we have merged this into the current work.
|
@@ -1,11 +1,11 @@
|
|
1
1
|
plain/models/AGENTS.md,sha256=xQQW-z-DehnCUyjiGSBfLqUjoSUdo_W1b0JmwYmWieA,209
|
2
|
-
plain/models/CHANGELOG.md,sha256=
|
2
|
+
plain/models/CHANGELOG.md,sha256=4voxndtCFoJPgNaMk6hb9-pmBS-pNOEvc8-zsgcPXXM,17129
|
3
3
|
plain/models/README.md,sha256=lqzWJrEIxBCHC1P8X1YoRjbsMFlu0-kG4ujP76B_ZO4,8572
|
4
4
|
plain/models/__init__.py,sha256=aB9HhIKBh0iK3LZztInAE-rDF-yKsdfcjfMtwtN5vnI,2920
|
5
5
|
plain/models/aggregates.py,sha256=P0mhsMl1VZt2CVHMuCHnNI8SxZ9citjDLEgioN6NOpo,7240
|
6
|
-
plain/models/base.py,sha256=
|
6
|
+
plain/models/base.py,sha256=4NkK-gkcxbIWZm7c9Q51eDwLClIieWZvlRg6l7vJOxE,65692
|
7
7
|
plain/models/cli.py,sha256=lhvlw7DVOU3CVoMUpHaj7qIbQ2d6qtSm_l9PdCeCnc0,36404
|
8
|
-
plain/models/config.py,sha256
|
8
|
+
plain/models/config.py,sha256=-m15VY1ZJKWdPGt-5i9fnMvz9LBzPfSRgWmWeEV8Dao,382
|
9
9
|
plain/models/connections.py,sha256=RBNa2FZ0x3C9un6PaYL-IYzH_OesRSpdHNGKvYHGiOM,2276
|
10
10
|
plain/models/constants.py,sha256=ndnj9TOTKW0p4YcIPLOLEbsH6mOgFi6B1-rIzr_iwwU,210
|
11
11
|
plain/models/constraints.py,sha256=Mm9gm5D7EKmo486dL481-hrTcxi2gxgqyUUtbGrkLjs,16749
|
@@ -22,8 +22,8 @@ plain/models/indexes.py,sha256=fazIZPJgCX5_Bhwk7MQy3YbWOxpHvaCe1dDLGGldTuY,11540
|
|
22
22
|
plain/models/lookups.py,sha256=eCsxQXUcOoAa_U_fAAd3edcgXI1wfyFW8hPgUh8TwTo,24776
|
23
23
|
plain/models/options.py,sha256=BOnu9NDVcgL0tJhan5gBbaK1SWNeg4NVTPNAzkKT3NE,21528
|
24
24
|
plain/models/otel.py,sha256=36QSJS6UXv1YPJTqeSmEvdMVHRkXa_zgqqItJaXc59g,7619
|
25
|
-
plain/models/preflight.py,sha256=
|
26
|
-
plain/models/query.py,sha256=
|
25
|
+
plain/models/preflight.py,sha256=_cBX7AnfQDNtZfoW0ydxH8WQM3ftCqcH0-tPhqS5q8c,8973
|
26
|
+
plain/models/query.py,sha256=0Mzg-tczpxGQ383GI2HwV-wf7GMKl_ivhPedeY1MpNY,90220
|
27
27
|
plain/models/query_utils.py,sha256=zxAdfwDbOmaN_SJODl4Wl9gs-q2EzOjXbsBFTWWhh8g,14174
|
28
28
|
plain/models/registry.py,sha256=5yxVgT_W8GlyL2bsGT2HvMQB5sKolXucP2qrhr7Wlnk,8126
|
29
29
|
plain/models/transaction.py,sha256=KqkRDT6aqMgbPA_ch7qO8a9NyDvwY_2FaxM7FkBkcgY,9357
|
@@ -39,9 +39,9 @@ plain/models/backends/base/features.py,sha256=1AehdhpeC7VobhggwpeXIt7HJNY2EWY700
|
|
39
39
|
plain/models/backends/base/introspection.py,sha256=8icKf9h8y4kobmyrbo8JWTDcpQIAt4oS_4FtCnY7FqQ,6815
|
40
40
|
plain/models/backends/base/operations.py,sha256=tzuw7AgVb3aZn2RHamReGNco7wIt4UBkAHx8HebDZ_s,25652
|
41
41
|
plain/models/backends/base/schema.py,sha256=GjASTEydinLbHg1f1-_l_eCu2CD3YV0vtT3Q7v8qTxY,64863
|
42
|
-
plain/models/backends/base/validation.py,sha256=
|
42
|
+
plain/models/backends/base/validation.py,sha256=ATkhZ36RgKHrXhdiOzIK5kRHW56eSggLhzrcviSJPQ8,1061
|
43
43
|
plain/models/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
|
-
plain/models/backends/mysql/base.py,sha256=
|
44
|
+
plain/models/backends/mysql/base.py,sha256=FCANhKAs2013oLPdC9y4PQCRb9NYsp1Zca_wha6TDT4,14286
|
45
45
|
plain/models/backends/mysql/client.py,sha256=YGjk4f5VOuIKcj5SOOJeBqiSDF0Ft9m1aUPOmLzdD6c,2973
|
46
46
|
plain/models/backends/mysql/compiler.py,sha256=NaYgcGyFUZ2lTOXXJj87hLMMMnXRAS1jUYkJq1NoCv4,3289
|
47
47
|
plain/models/backends/mysql/creation.py,sha256=ozuc3mz65bjFz6sn5BFLRRGQsUYaxwIGjQyKod31c1Y,952
|
@@ -49,18 +49,18 @@ plain/models/backends/mysql/features.py,sha256=OPHaiqPmAFAUZqnZdLOqbCmxmuGMnIqa6
|
|
49
49
|
plain/models/backends/mysql/introspection.py,sha256=R3U912qnWwJDmTiX7QzGAXTc2LAShIhp4C6xHTABM68,13960
|
50
50
|
plain/models/backends/mysql/operations.py,sha256=PieuZMwRtdAGRUR-TAIsOxR7qS-70h1B6LbyA3VR0YM,16591
|
51
51
|
plain/models/backends/mysql/schema.py,sha256=LmP62COVuhpbH4gYulcSQNJgGuolc3RTFGsudoohJOQ,9942
|
52
|
-
plain/models/backends/mysql/validation.py,sha256=
|
52
|
+
plain/models/backends/mysql/validation.py,sha256=DYnuPvIXGeLi66_uCZISKsS9xFTgj5CIWfaO8iarzu4,1996
|
53
53
|
plain/models/backends/postgresql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
54
|
-
plain/models/backends/postgresql/base.py,sha256=
|
54
|
+
plain/models/backends/postgresql/base.py,sha256=5GPl5lc5wld9sL0oL-kAmstm-c6E5JGN3fxijiQp7o8,15836
|
55
55
|
plain/models/backends/postgresql/client.py,sha256=EcqNtyQ9Kt5mA6sOmrO_5PGZBGo7fjMc9VQ-hcxJs1s,2055
|
56
56
|
plain/models/backends/postgresql/creation.py,sha256=HSGzWzsx3-IayEVZvgqcYqIE_HCtAEBK0uIPh5duPKg,1555
|
57
57
|
plain/models/backends/postgresql/features.py,sha256=O8iWfAjqyOX7DhjZaGJvyO-vmWcrkDopFnG2bHEQK44,1322
|
58
58
|
plain/models/backends/postgresql/introspection.py,sha256=n_H2FIMzF5MI1D7kW7u5J1-ny2bM3_ARvSx4zuXpfQ4,11163
|
59
|
-
plain/models/backends/postgresql/operations.py,sha256=
|
59
|
+
plain/models/backends/postgresql/operations.py,sha256=kEP_Eoi2v-fUd902e7pYHrJtwjSg6069_ShwWOxB3qk,11192
|
60
60
|
plain/models/backends/postgresql/schema.py,sha256=6nruXkfuVesoqeCK5xDzGuZQRJLWj6n8G1VkPPzw8b0,13543
|
61
61
|
plain/models/backends/sqlite3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
62
62
|
plain/models/backends/sqlite3/_functions.py,sha256=XsohPZN-xFEEmC28stQzAiSMvE0nHJ1cMHfL2Ze72vI,14317
|
63
|
-
plain/models/backends/sqlite3/base.py,sha256=
|
63
|
+
plain/models/backends/sqlite3/base.py,sha256=tvAt7ptT284wCLwMr-y68WEeojG95S_6PKzlImGkW38,13220
|
64
64
|
plain/models/backends/sqlite3/client.py,sha256=dvxY10LFJHKY6ykOuCE6e45Wo4fAH4IPDtNCH3Wvd34,324
|
65
65
|
plain/models/backends/sqlite3/creation.py,sha256=dH4rqZj79TCMHmaBash4I_io15QCxnam92fuWrRK_R8,2788
|
66
66
|
plain/models/backends/sqlite3/features.py,sha256=V7ueGfbUSzBNGgMRtCptXSH_0b51lyVfzi-98BX4afo,2366
|
@@ -71,10 +71,10 @@ plain/models/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
71
71
|
plain/models/backups/cli.py,sha256=AKVh_Go0LxnxFi2jQjmpPEbbJvYCurjJsGCWESm1X8A,2960
|
72
72
|
plain/models/backups/clients.py,sha256=gHYQkukqamR_uksMr9wy3tBpMxK6DyUyj7nndNIlbo8,4744
|
73
73
|
plain/models/backups/core.py,sha256=09IZUhBEe1Yej3PC8AidtkaI0c8tt7VnqGBCWK-WrFg,3318
|
74
|
-
plain/models/fields/__init__.py,sha256
|
75
|
-
plain/models/fields/json.py,sha256=
|
76
|
-
plain/models/fields/mixins.py,sha256=
|
77
|
-
plain/models/fields/related.py,sha256=
|
74
|
+
plain/models/fields/__init__.py,sha256=-daSts1wN63oU_XXQUlNPmk81-JPQzXwY1FdCMRnTng,74732
|
75
|
+
plain/models/fields/json.py,sha256=4WHZX5MI-GZapcaaHltPgc6f9pHAezjfaTYNh_PX8rQ,18041
|
76
|
+
plain/models/fields/mixins.py,sha256=wmu3JJEOimijgepjMEFPN8u74mHpefgnsB4u5ZzVCUY,1890
|
77
|
+
plain/models/fields/related.py,sha256=7Ku8E5hxQxVgJy3afWZfuDlHDzrky_4mkKwPlqLpM6o,51065
|
78
78
|
plain/models/fields/related_descriptors.py,sha256=nsVgLjpOlrha90eTfg7ad_il6_uI_YG0d4bH51LP3Os,15180
|
79
79
|
plain/models/fields/related_lookups.py,sha256=9y6AfEcg8xRRZne2LXFP6jym9mecFlB_toYih7lD8Uw,7781
|
80
80
|
plain/models/fields/related_managers.py,sha256=XiV2IvuEFLEWnej2KokCu6HFx87UyZTqqsP74v2xIHw,25011
|
@@ -97,7 +97,7 @@ plain/models/migrations/optimizer.py,sha256=HH-uz-jnWw_Ni6F2_rRW1nax1Dxmf1s_F_8s
|
|
97
97
|
plain/models/migrations/questioner.py,sha256=qAsePI5JHiSJrlY_kmpgMuK9Dom22q17edov7RtBeGw,11967
|
98
98
|
plain/models/migrations/recorder.py,sha256=_ncIVLJ4ns6AaO0vVmCoXfABlOFXDKu8NTPsutqKjK4,3653
|
99
99
|
plain/models/migrations/serializer.py,sha256=yBP9TyUZlSh_8qdw1I4VotbsZqoomz3mBs7ASQLsDH8,12459
|
100
|
-
plain/models/migrations/state.py,sha256=
|
100
|
+
plain/models/migrations/state.py,sha256=EB3BCST2SxpijGjdEhh2Jqp-wr4Fb29bhvOZP3ZWdqg,32120
|
101
101
|
plain/models/migrations/utils.py,sha256=Ih_mu6UbdUSt-ZtHaB0xIXHDrBANuFZyftTQ56BFJYs,4174
|
102
102
|
plain/models/migrations/writer.py,sha256=N8Rnjv5ccsA_CTcS7zZyppzyHFOUQVJy0l6RZYjwF-0,10981
|
103
103
|
plain/models/migrations/operations/__init__.py,sha256=YKZsQsJ4G5iw9F4o6dOSgSCuLiiKuApvneoV4jqjZaA,752
|
@@ -115,8 +115,8 @@ plain/models/sql/where.py,sha256=ezE9Clt2BmKo-I7ARsgqZ_aVA-1UdayCwr6ULSWZL6c,126
|
|
115
115
|
plain/models/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
116
116
|
plain/models/test/pytest.py,sha256=KD5-mxonBxOYIhUh9Ql5uJOIiC9R4t-LYfb6sjA0UdE,3486
|
117
117
|
plain/models/test/utils.py,sha256=S3d6zf3OFWDxB_kBJr0tDvwn51bjwDVWKPumv37N-p8,467
|
118
|
-
plain_models-0.
|
119
|
-
plain_models-0.
|
120
|
-
plain_models-0.
|
121
|
-
plain_models-0.
|
122
|
-
plain_models-0.
|
118
|
+
plain_models-0.46.1.dist-info/METADATA,sha256=WuLQKMHTTBKeEP1zmLYoHbjVxxkIi3sKOgee-MewjrM,8884
|
119
|
+
plain_models-0.46.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
120
|
+
plain_models-0.46.1.dist-info/entry_points.txt,sha256=IYJAW9MpL3PXyXFWmKmALagAGXC_5rzBn2eEGJlcV04,112
|
121
|
+
plain_models-0.46.1.dist-info/licenses/LICENSE,sha256=m0D5O7QoH9l5Vz_rrX_9r-C8d9UNr_ciK6Qwac7o6yo,3175
|
122
|
+
plain_models-0.46.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|