ramifice 0.4.8__py3-none-any.whl → 0.4.10__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.
- ramifice/commons/general.py +21 -1
- ramifice/commons/one.py +3 -3
- ramifice/commons/tools.py +0 -18
- ramifice/fields/choice_float_dyn_field.py +3 -1
- ramifice/fields/choice_float_field.py +1 -1
- ramifice/fields/choice_float_mult_dyn_field.py +3 -1
- ramifice/fields/choice_float_mult_field.py +1 -1
- ramifice/fields/choice_int_dyn_field.py +3 -1
- ramifice/fields/choice_int_field.py +1 -1
- ramifice/fields/choice_int_mult_dyn_field.py +3 -1
- ramifice/fields/choice_int_mult_field.py +1 -1
- ramifice/fields/choice_text_dyn_field.py +3 -1
- ramifice/fields/choice_text_field.py +1 -1
- ramifice/fields/choice_text_mult_dyn_field.py +3 -1
- ramifice/fields/choice_text_mult_field.py +1 -1
- ramifice/paladins/check.py +5 -1
- ramifice/paladins/groups/choice_group.py +1 -1
- ramifice/utils/fixtures.py +2 -1
- ramifice/utils/migration.py +14 -11
- {ramifice-0.4.8.dist-info → ramifice-0.4.10.dist-info}/METADATA +8 -3
- {ramifice-0.4.8.dist-info → ramifice-0.4.10.dist-info}/RECORD +23 -23
- {ramifice-0.4.8.dist-info → ramifice-0.4.10.dist-info}/WHEEL +0 -0
- {ramifice-0.4.8.dist-info → ramifice-0.4.10.dist-info}/licenses/LICENSE +0 -0
ramifice/commons/general.py
CHANGED
@@ -6,12 +6,32 @@ from pymongo.asynchronous.collection import AsyncCollection
|
|
6
6
|
from pymongo.asynchronous.command_cursor import AsyncCommandCursor
|
7
7
|
from pymongo.asynchronous.database import AsyncDatabase
|
8
8
|
|
9
|
-
from ..utils import globals
|
9
|
+
from ..utils import globals, translations
|
10
10
|
|
11
11
|
|
12
12
|
class GeneralMixin:
|
13
13
|
"""General purpose query methods."""
|
14
14
|
|
15
|
+
@classmethod
|
16
|
+
def from_mongo_doc(
|
17
|
+
cls,
|
18
|
+
mongo_doc: dict[str, Any],
|
19
|
+
) -> Any:
|
20
|
+
"""Create object instance from Mongo document."""
|
21
|
+
obj: Any = cls()
|
22
|
+
lang: str = translations.CURRENT_LOCALE
|
23
|
+
for name, data in mongo_doc.items():
|
24
|
+
field = obj.__dict__.get(name)
|
25
|
+
if field is None:
|
26
|
+
continue
|
27
|
+
if field.field_type == "TextField":
|
28
|
+
field.value = data.get(lang, "") if data is not None else None
|
29
|
+
elif field.group == "pass":
|
30
|
+
field.value = None
|
31
|
+
else:
|
32
|
+
field.value = data
|
33
|
+
return obj
|
34
|
+
|
15
35
|
@classmethod
|
16
36
|
async def estimated_document_count( # type: ignore[no-untyped-def]
|
17
37
|
cls,
|
ramifice/commons/one.py
CHANGED
@@ -7,7 +7,7 @@ from pymongo.results import DeleteResult
|
|
7
7
|
|
8
8
|
from ..utils import globals
|
9
9
|
from ..utils.errors import PanicError
|
10
|
-
from .tools import
|
10
|
+
from .tools import mongo_doc_to_raw_doc, password_to_none
|
11
11
|
|
12
12
|
|
13
13
|
class OneMixin:
|
@@ -67,7 +67,7 @@ class OneMixin:
|
|
67
67
|
mongo_doc = await collection.find_one(filter, *args, **kwargs)
|
68
68
|
if mongo_doc is not None:
|
69
69
|
# Convert document to Model instance.
|
70
|
-
inst_model = from_mongo_doc(
|
70
|
+
inst_model = cls.from_mongo_doc(mongo_doc)
|
71
71
|
return inst_model
|
72
72
|
|
73
73
|
@classmethod
|
@@ -85,7 +85,7 @@ class OneMixin:
|
|
85
85
|
mongo_doc = await collection.find_one(filter, *args, **kwargs)
|
86
86
|
if mongo_doc is not None:
|
87
87
|
# Convert document to Model instance.
|
88
|
-
inst_model = from_mongo_doc(
|
88
|
+
inst_model = cls.from_mongo_doc( mongo_doc)
|
89
89
|
json_str = inst_model.to_json()
|
90
90
|
return json_str
|
91
91
|
|
ramifice/commons/tools.py
CHANGED
@@ -18,24 +18,6 @@ def password_to_none(
|
|
18
18
|
return mongo_doc
|
19
19
|
|
20
20
|
|
21
|
-
def from_mongo_doc(
|
22
|
-
cls_model: Any,
|
23
|
-
mongo_doc: dict[str, Any],
|
24
|
-
) -> Any:
|
25
|
-
"""Create object instance from Mongo document."""
|
26
|
-
obj: Any = cls_model()
|
27
|
-
lang: str = translations.CURRENT_LOCALE
|
28
|
-
for name, data in mongo_doc.items():
|
29
|
-
field = obj.__dict__[name]
|
30
|
-
if field.field_type == "TextField":
|
31
|
-
field.value = data.get(lang, "") if data is not None else None
|
32
|
-
elif field.group == "pass":
|
33
|
-
field.value = None
|
34
|
-
else:
|
35
|
-
field.value = data
|
36
|
-
return obj
|
37
|
-
|
38
|
-
|
39
21
|
def mongo_doc_to_raw_doc(
|
40
22
|
field_name_and_type: dict[str, str],
|
41
23
|
mongo_doc: dict[str, Any],
|
@@ -69,8 +69,10 @@ class ChoiceFloatDynField(Field, ChoiceGroup, JsonMixin):
|
|
69
69
|
self.value: float | None = None
|
70
70
|
self.choices: dict[str, float] | None = None
|
71
71
|
|
72
|
-
def has_value(self) -> bool:
|
72
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
73
73
|
"""Does the field value match the possible options in choices."""
|
74
|
+
if is_migrat:
|
75
|
+
return True
|
74
76
|
value = self.value
|
75
77
|
if value is not None:
|
76
78
|
choices = self.choices
|
@@ -80,7 +80,7 @@ class ChoiceFloatField(Field, ChoiceGroup, JsonMixin):
|
|
80
80
|
if not isinstance(readonly, bool):
|
81
81
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
82
82
|
|
83
|
-
def has_value(self) -> bool:
|
83
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
84
84
|
"""Does the field value match the possible options in choices."""
|
85
85
|
value = self.value
|
86
86
|
if value is None:
|
@@ -69,8 +69,10 @@ class ChoiceFloatMultDynField(Field, ChoiceGroup, JsonMixin):
|
|
69
69
|
self.value: list[float] | None = None
|
70
70
|
self.choices: dict[str, float] | None = None
|
71
71
|
|
72
|
-
def has_value(self) -> bool:
|
72
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
73
73
|
"""Does the field value match the possible options in choices."""
|
74
|
+
if is_migrat:
|
75
|
+
return True
|
74
76
|
value = self.value
|
75
77
|
if value is not None:
|
76
78
|
choices = self.choices
|
@@ -91,7 +91,7 @@ class ChoiceFloatMultField(Field, ChoiceGroup, JsonMixin):
|
|
91
91
|
if not isinstance(readonly, bool):
|
92
92
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
93
93
|
|
94
|
-
def has_value(self) -> bool:
|
94
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
95
95
|
"""Does the field value match the possible options in choices."""
|
96
96
|
value = self.value
|
97
97
|
if value is None:
|
@@ -69,8 +69,10 @@ class ChoiceIntDynField(Field, ChoiceGroup, JsonMixin):
|
|
69
69
|
self.value: int | None = None
|
70
70
|
self.choices: dict[str, int] | None = None
|
71
71
|
|
72
|
-
def has_value(self) -> bool:
|
72
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
73
73
|
"""Does the field value match the possible options in choices."""
|
74
|
+
if is_migrat:
|
75
|
+
return True
|
74
76
|
value = self.value
|
75
77
|
if value is not None:
|
76
78
|
choices = self.choices
|
@@ -80,7 +80,7 @@ class ChoiceIntField(Field, ChoiceGroup, JsonMixin):
|
|
80
80
|
if not isinstance(readonly, bool):
|
81
81
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
82
82
|
|
83
|
-
def has_value(self) -> bool:
|
83
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
84
84
|
"""Does the field value match the possible options in choices."""
|
85
85
|
value = self.value
|
86
86
|
if value is None:
|
@@ -69,8 +69,10 @@ class ChoiceIntMultDynField(Field, ChoiceGroup, JsonMixin):
|
|
69
69
|
self.value: list[int] | None = None
|
70
70
|
self.choices: dict[str, int] | None = None
|
71
71
|
|
72
|
-
def has_value(self) -> bool:
|
72
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
73
73
|
"""Does the field value match the possible options in choices."""
|
74
|
+
if is_migrat:
|
75
|
+
return True
|
74
76
|
value = self.value
|
75
77
|
if value is not None:
|
76
78
|
choices = self.choices
|
@@ -91,7 +91,7 @@ class ChoiceIntMultField(Field, ChoiceGroup, JsonMixin):
|
|
91
91
|
if not isinstance(readonly, bool):
|
92
92
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
93
93
|
|
94
|
-
def has_value(self) -> bool:
|
94
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
95
95
|
"""Does the field value match the possible options in choices."""
|
96
96
|
value = self.value
|
97
97
|
if value is None:
|
@@ -69,8 +69,10 @@ class ChoiceTextDynField(Field, ChoiceGroup, JsonMixin):
|
|
69
69
|
self.value: str | None = None
|
70
70
|
self.choices: dict[str, str] | None = None
|
71
71
|
|
72
|
-
def has_value(self) -> bool:
|
72
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
73
73
|
"""Does the field value match the possible options in choices."""
|
74
|
+
if is_migrat:
|
75
|
+
return True
|
74
76
|
value = self.value
|
75
77
|
if value is not None:
|
76
78
|
choices = self.choices
|
@@ -85,7 +85,7 @@ class ChoiceTextField(Field, ChoiceGroup, JsonMixin):
|
|
85
85
|
if not isinstance(readonly, bool):
|
86
86
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
87
87
|
|
88
|
-
def has_value(self) -> bool:
|
88
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
89
89
|
"""Does the field value match the possible options in choices."""
|
90
90
|
value = self.value
|
91
91
|
if value is None:
|
@@ -69,8 +69,10 @@ class ChoiceTextMultDynField(Field, ChoiceGroup, JsonMixin):
|
|
69
69
|
self.value: list[str] | None = None
|
70
70
|
self.choices: dict[str, str] | None = None
|
71
71
|
|
72
|
-
def has_value(self) -> bool:
|
72
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
73
73
|
"""Does the field value match the possible options in choices."""
|
74
|
+
if is_migrat:
|
75
|
+
return True
|
74
76
|
value = self.value
|
75
77
|
if value is not None:
|
76
78
|
choices = self.choices
|
@@ -91,7 +91,7 @@ class ChoiceTextMultField(Field, ChoiceGroup, JsonMixin):
|
|
91
91
|
if not isinstance(readonly, bool):
|
92
92
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
93
93
|
|
94
|
-
def has_value(self) -> bool:
|
94
|
+
def has_value(self, is_migrat: bool = False) -> bool:
|
95
95
|
"""Does the field value match the possible options in choices."""
|
96
96
|
value = self.value
|
97
97
|
if value is None:
|
ramifice/paladins/check.py
CHANGED
@@ -38,7 +38,10 @@ class CheckMixin(
|
|
38
38
|
"""Validation of Model data before saving to the database."""
|
39
39
|
|
40
40
|
async def check(
|
41
|
-
self,
|
41
|
+
self,
|
42
|
+
is_save: bool = False,
|
43
|
+
collection: AsyncCollection | None = None,
|
44
|
+
is_migration_process: bool = False,
|
42
45
|
) -> dict[str, Any]:
|
43
46
|
"""Validation of Model data before saving to the database.
|
44
47
|
|
@@ -84,6 +87,7 @@ class CheckMixin(
|
|
84
87
|
"field_data": None,
|
85
88
|
"full_model_name": cls_model.META["full_model_name"],
|
86
89
|
"is_migrate_model": is_migrate_model,
|
90
|
+
"is_migration_process": is_migration_process,
|
87
91
|
"curr_doc": (
|
88
92
|
await collection.find_one({"_id": doc_id}) if is_save and is_update else None
|
89
93
|
),
|
@@ -37,7 +37,7 @@ class ChoiceGroupMixin:
|
|
37
37
|
params["result_map"][field.name] = None
|
38
38
|
return
|
39
39
|
# Does the field value match the possible options in choices.
|
40
|
-
if not field.has_value():
|
40
|
+
if not field.has_value(is_migrat=params["is_migration_process"]):
|
41
41
|
err_msg = translations._("Your choice does not match the options offered !")
|
42
42
|
accumulate_error(err_msg, params)
|
43
43
|
# Insert result.
|
ramifice/utils/fixtures.py
CHANGED
@@ -68,7 +68,8 @@ async def apply_fixture(
|
|
68
68
|
print(colored("\nFIXTURE:", "red", attrs=["bold"]))
|
69
69
|
print(colored(fixture_path, "blue", attrs=["bold"]))
|
70
70
|
inst_model.print_err()
|
71
|
-
|
71
|
+
msg = f"Fixture `{fixture_name}` failed."
|
72
|
+
raise PanicError(msg)
|
72
73
|
# Get data for document.
|
73
74
|
checked_data: dict[str, Any] = result_check["data"]
|
74
75
|
# Add date and time.
|
ramifice/utils/migration.py
CHANGED
@@ -102,7 +102,7 @@ class Monitor:
|
|
102
102
|
# Delete collection associated with non-existent Model.
|
103
103
|
await database.drop_collection(collection_name) # type: ignore[union-attr]
|
104
104
|
|
105
|
-
async def
|
105
|
+
async def migrate(self) -> None:
|
106
106
|
"""Run migration process.
|
107
107
|
|
108
108
|
1) Update the state of Models in the super collection.
|
@@ -154,7 +154,9 @@ class Monitor:
|
|
154
154
|
#
|
155
155
|
inst_model = cls_model.from_mongo_doc(mongo_doc)
|
156
156
|
result_check: dict[str, Any] = await inst_model.check(
|
157
|
-
is_save=True,
|
157
|
+
is_save=True,
|
158
|
+
collection=model_collection,
|
159
|
+
is_migration_process=True,
|
158
160
|
)
|
159
161
|
if not result_check["is_valid"]:
|
160
162
|
print(colored("\n!!!>>MIGRATION<<!!!", "red", attrs=["bold"]))
|
@@ -174,20 +176,21 @@ class Monitor:
|
|
174
176
|
checked_data["updated_at"] = datetime.now()
|
175
177
|
# Update the document in the database.
|
176
178
|
await model_collection.replace_one(
|
177
|
-
filter={"_id": checked_data["_id"]},
|
179
|
+
filter={"_id": checked_data["_id"]},
|
180
|
+
replacement=checked_data,
|
178
181
|
)
|
179
182
|
#
|
180
183
|
# Refresh the dynamic fields data for the current model.
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
184
|
+
for field_name, field_data in metadata["data_dynamic_fields"].items():
|
185
|
+
if model_state["data_dynamic_fields"].get(field_name, False) == False:
|
186
|
+
model_state["data_dynamic_fields"][field_name] = field_data
|
187
|
+
else:
|
188
|
+
metadata["data_dynamic_fields"][field_name] = model_state[
|
189
|
+
"data_dynamic_fields"
|
190
|
+
][field_name]
|
191
|
+
# Refresh state of current Model.
|
188
192
|
model_state["data_dynamic_field"] = metadata["data_dynamic_fields"]
|
189
193
|
model_state["field_name_and_type"] = metadata["field_name_and_type"]
|
190
|
-
# Refresh state of current Model.
|
191
194
|
await super_collection.replace_one(
|
192
195
|
filter={"collection_name": model_state["collection_name"]},
|
193
196
|
replacement=model_state,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ramifice
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.10
|
4
4
|
Summary: ORM-like API MongoDB for Python language.
|
5
5
|
Project-URL: Homepage, https://github.com/kebasyaty/ramifice
|
6
6
|
Project-URL: Documentation, https://kebasyaty.github.io/ramifice/
|
@@ -220,7 +220,7 @@ async def main():
|
|
220
220
|
await migration.Monitor(
|
221
221
|
database_name="test_db",
|
222
222
|
mongo_client=client,
|
223
|
-
).
|
223
|
+
).migrate()
|
224
224
|
|
225
225
|
# If you need to change the language of translation.
|
226
226
|
# Hint: For Ramifice by default = "en"
|
@@ -453,6 +453,11 @@ collection = await User.collection()
|
|
453
453
|
q_filter = {"email": "John_Smith@gmail.com"}
|
454
454
|
mongo_doc = await User.find_one(q_filter)
|
455
455
|
|
456
|
+
# Create object instance from Mongo document.
|
457
|
+
q_filter = {"email": "John_Smith@gmail.com"}
|
458
|
+
mongo_doc = await User.find_one(q_filter)
|
459
|
+
user = User.from_mongo_doc(mongo_doc)
|
460
|
+
|
456
461
|
# Find a single document and converting to raw document.
|
457
462
|
q_filter = {"email": "John_Smith@gmail.com"}
|
458
463
|
raw_doc = await User.find_one_to_raw_doc(q_filter)
|
@@ -516,7 +521,7 @@ async for index in await User.list_indexes():
|
|
516
521
|
# Units Management.
|
517
522
|
# Management for `choices` parameter in dynamic field types.
|
518
523
|
# Units are stored in a separate collection.
|
519
|
-
from ramifice
|
524
|
+
from ramifice import Unit
|
520
525
|
unit = Unit(
|
521
526
|
field="field_name", # The name of the dynamic field.
|
522
527
|
title="Title", # The name of the choice item.
|
@@ -1,26 +1,26 @@
|
|
1
1
|
ramifice/__init__.py,sha256=IuI20h84QWyFftykvte_HLft2iVxwpu0K592NypMwfo,759
|
2
2
|
ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
ramifice/commons/__init__.py,sha256=FTG78sTU0ay0rvmrq5fUmVjL-I-S7wgQq3BLcyqnjrQ,433
|
4
|
-
ramifice/commons/general.py,sha256=
|
4
|
+
ramifice/commons/general.py,sha256=yi52I9t8R1XePZdyrPmhXJxLc_YkY72Ea7_dBvsKfXI,4984
|
5
5
|
ramifice/commons/indexes.py,sha256=hAcWKZ9MMgLbRtoQ6Af0b8r-PY0dbEYmMBl8z_d1DRo,3646
|
6
6
|
ramifice/commons/many.py,sha256=KGt7licVJmLADvyPtH7-GbXHig-EnGFbnk7QKu3mfvQ,8214
|
7
|
-
ramifice/commons/one.py,sha256=
|
8
|
-
ramifice/commons/tools.py,sha256=
|
7
|
+
ramifice/commons/one.py,sha256=MwUlU9getNtwTOL6-lROdzViBsChWgMIMppCWoeAnFU,5815
|
8
|
+
ramifice/commons/tools.py,sha256=s4CdHb9h8aqR371py0KVsBnNBJSW8-7AVjbTmuFAeeg,1793
|
9
9
|
ramifice/commons/unit_manager.py,sha256=IkWqXu1PHHal0aGfx6zme81iXPeygxPqEWO-u_8RXoI,4356
|
10
10
|
ramifice/fields/__init__.py,sha256=yRfX7Tvpuh27Ggcx5u9e1RRYK7Wu59EVJYxxetmuP1w,1290
|
11
11
|
ramifice/fields/bool_field.py,sha256=WWubSwsFJZu8b3MviDd2zXnNYOQaYw8toklFNSTVFLA,2072
|
12
|
-
ramifice/fields/choice_float_dyn_field.py,sha256=
|
13
|
-
ramifice/fields/choice_float_field.py,sha256=
|
14
|
-
ramifice/fields/choice_float_mult_dyn_field.py,sha256=
|
15
|
-
ramifice/fields/choice_float_mult_field.py,sha256=
|
16
|
-
ramifice/fields/choice_int_dyn_field.py,sha256=
|
17
|
-
ramifice/fields/choice_int_field.py,sha256=
|
18
|
-
ramifice/fields/choice_int_mult_dyn_field.py,sha256=
|
19
|
-
ramifice/fields/choice_int_mult_field.py,sha256=
|
20
|
-
ramifice/fields/choice_text_dyn_field.py,sha256=
|
21
|
-
ramifice/fields/choice_text_field.py,sha256=
|
22
|
-
ramifice/fields/choice_text_mult_dyn_field.py,sha256=
|
23
|
-
ramifice/fields/choice_text_mult_field.py,sha256=
|
12
|
+
ramifice/fields/choice_float_dyn_field.py,sha256=FNOX8999vOz9S_0UK1Mn_K9s3Mmy7OeXioCM1bOwtD0,3091
|
13
|
+
ramifice/fields/choice_float_field.py,sha256=rf93rsDkl4AImIIimkpFdMf3DzDq4j3yCzv_alu-R5U,3674
|
14
|
+
ramifice/fields/choice_float_mult_dyn_field.py,sha256=RRSWEietLjR3e0R62oq7c8PIng0XmHoLLJj0k9veE60,3154
|
15
|
+
ramifice/fields/choice_float_mult_field.py,sha256=a3n1YnBN7VBu45nLIl3eu3FcuEj86LebvT_iPzgLFnc,4231
|
16
|
+
ramifice/fields/choice_int_dyn_field.py,sha256=QhP0mGHTj3V4KKPj6hsc05bOe4Hw2TnNHimQBixVYAs,3085
|
17
|
+
ramifice/fields/choice_int_field.py,sha256=PyyFCkz-2lwKLJaKdR0DwYctMSk7n0iqxFbYeXUhVJQ,3662
|
18
|
+
ramifice/fields/choice_int_mult_dyn_field.py,sha256=NMPDWcgR6doeCHPYIHFeD9w66FcE6uKIVEIW4Zmk3YA,3150
|
19
|
+
ramifice/fields/choice_int_mult_field.py,sha256=gzmtf9segqAH7IuaZjR6l9cyaCNIrBdWKRuNPAU0Klk,4225
|
20
|
+
ramifice/fields/choice_text_dyn_field.py,sha256=yfk9pa1_KEKFNL5PzvTkRuz_83q3Lf38sBdogBQpybI,3081
|
21
|
+
ramifice/fields/choice_text_field.py,sha256=W4X5HkMVBrxu_6hWRfOffU6GAhgJEh9fJAb6cLIESPk,3867
|
22
|
+
ramifice/fields/choice_text_mult_dyn_field.py,sha256=xU_8mGPHIsRFndziE5o2NhuxwSg_cJX1mSBYMQtB8Yw,3146
|
23
|
+
ramifice/fields/choice_text_mult_field.py,sha256=0pNE2WWoyk_rX7-IMq3KUx6Yxl8OzSf0-_WGTRnxX1g,4221
|
24
24
|
ramifice/fields/color_field.py,sha256=NdYey3Og8hh7oK7yDljrG6K8frgqj4C2OTXFnJVAYFQ,3526
|
25
25
|
ramifice/fields/date_field.py,sha256=w875p6JwssKhEZJLBHmC8sE5wArn161rlQi0Zt-qEZo,5214
|
26
26
|
ramifice/fields/date_time_field.py,sha256=OGi-ED-Gm_AWGzczHA1qch59IuWy3KkVIJHQl3OlatU,5249
|
@@ -48,7 +48,7 @@ ramifice/models/decorator.py,sha256=jOEn-0v0m_tM7mow45-tM-8LADUmwlG2DWZsEuC9S_w,
|
|
48
48
|
ramifice/models/model.py,sha256=ZvgIbcuSXuAkBl_FofOZXGwWMwlqKB-PwTMyXiqK-Fo,6610
|
49
49
|
ramifice/models/pseudo.py,sha256=PhLQM4zXdaOtTSmNFzwN4twlUmdvA1D_-YOMJtaOIwM,6754
|
50
50
|
ramifice/paladins/__init__.py,sha256=PIP3AXI2KBRXNcLJUF0d7ygJ7VLOAxlhb4HRKQ9MGYY,516
|
51
|
-
ramifice/paladins/check.py,sha256=
|
51
|
+
ramifice/paladins/check.py,sha256=ennDiVAoCZIS3aKBK0eA-Vt8VJQnbIv90be5IFYraFg,7026
|
52
52
|
ramifice/paladins/delete.py,sha256=tw50E98D5eFZ7gHGnh_8ztUB1LeTeWWKZvIcQqlgbF8,3352
|
53
53
|
ramifice/paladins/password.py,sha256=w1XWh3bsncH1VTVjCLxyKI2waxMvltwcsPWW3V9Ib84,3027
|
54
54
|
ramifice/paladins/refrash.py,sha256=fw-9x_NKGzreipBt_F9KF6FTsYm9hSzfq4ubi1FHYrQ,1065
|
@@ -57,7 +57,7 @@ ramifice/paladins/tools.py,sha256=QxxwZILyBLcAiDUN48KE99c_cHVjG-VYilEsIinRhEU,26
|
|
57
57
|
ramifice/paladins/validation.py,sha256=gcEJXIEPu1g7Z54vl14YTs5rCmxOEYsgQH1usFfyy7k,1730
|
58
58
|
ramifice/paladins/groups/__init__.py,sha256=hpqmWLsYAMvZHAbmMXluQSqLhkHOSTUAgLHyTM1LTYI,472
|
59
59
|
ramifice/paladins/groups/bool_group.py,sha256=oJc9mw9KGrnK_Pj7uXixYYQAJphcXLr_xSQv3PMUlcU,792
|
60
|
-
ramifice/paladins/groups/choice_group.py,sha256=
|
60
|
+
ramifice/paladins/groups/choice_group.py,sha256=96MOiOn-dD_GgYOCBjkG_Gct-mEF35z1TSCzEkyXK5o,1768
|
61
61
|
ramifice/paladins/groups/date_group.py,sha256=B9usKKrHX16F1ckik60Xkub1tawgNENSHTk5Rt-K96k,3741
|
62
62
|
ramifice/paladins/groups/file_group.py,sha256=-xgtrLOTlKXc71Mnbu3I_LbYnTEd8OprnhtYcJbaDtg,2932
|
63
63
|
ramifice/paladins/groups/id_group.py,sha256=q5BeoM1e7mZmX0zVgemva9K-9ihJKBrX8kxvMh-uhhQ,1268
|
@@ -68,9 +68,9 @@ ramifice/paladins/groups/slug_group.py,sha256=joBB5litljbv2h5JKEMzF71s_DKMWH6nzg
|
|
68
68
|
ramifice/paladins/groups/text_group.py,sha256=rUWNaAPkTMMlRf6A-6nQAa4HCj6NBTjPKIYaEKSOUL4,4305
|
69
69
|
ramifice/utils/__init__.py,sha256=xixHoOX4ja5jIUZemem1qn4k4aonv3G3Q76azQK_pkU,43
|
70
70
|
ramifice/utils/errors.py,sha256=iuhq7fzpUmsOyeXeg2fJjta8yAuqlXLKsZVMpfUhtHE,1901
|
71
|
-
ramifice/utils/fixtures.py,sha256=
|
71
|
+
ramifice/utils/fixtures.py,sha256=qsv9cg06lc82XaRlhI1j5vftmOQTTwOcDXCg_lnpK04,3159
|
72
72
|
ramifice/utils/globals.py,sha256=uR20um3Qg_1SG1t7WyWbpq8kQD-9Mslyr_c1yh5Hw9w,1751
|
73
|
-
ramifice/utils/migration.py,sha256=
|
73
|
+
ramifice/utils/migration.py,sha256=ol8ysNGBr0wuOwo00ZbbN0U8YKiiYVgyRYja0axdiHM,11059
|
74
74
|
ramifice/utils/tools.py,sha256=sOKzwnvf6vdTNf9r6PKAdw6aB4undat2Z8tzS3M1GnQ,2733
|
75
75
|
ramifice/utils/translations.py,sha256=GNGE0ULAA0aOY5pTxUd3MQW-nVaKvp6BeXWEcsR0s0o,4048
|
76
76
|
ramifice/utils/unit.py,sha256=qJ2SpClsFcMRcwB_ZA-QlrB5T9OinCBiWx5KqQ9vH_A,2266
|
@@ -79,7 +79,7 @@ ramifice/utils/mixins/add_valid.py,sha256=TLOObedzXNA9eCylfAVbVCqIKE5sV-P5AdIN7a
|
|
79
79
|
ramifice/utils/mixins/hooks.py,sha256=33jvJRhfnJeL2Hd_YFXk3M_7wjqHaByU2wRjKyboL6s,914
|
80
80
|
ramifice/utils/mixins/indexing.py,sha256=Z0427HoaVRyNmSNN8Fx0mSICgAKV-gDdu3iR5qYUEbs,329
|
81
81
|
ramifice/utils/mixins/json_converter.py,sha256=WhigXyDAV-FfILaZuwvRFRIk0D90Rv3dG5t-mv5fVyc,1107
|
82
|
-
ramifice-0.4.
|
83
|
-
ramifice-0.4.
|
84
|
-
ramifice-0.4.
|
85
|
-
ramifice-0.4.
|
82
|
+
ramifice-0.4.10.dist-info/METADATA,sha256=KO9Jhk80L6Y9NajuZQ37nBSWxJt1XRHcyTGO2VFbuWY,21787
|
83
|
+
ramifice-0.4.10.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
84
|
+
ramifice-0.4.10.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
|
85
|
+
ramifice-0.4.10.dist-info/RECORD,,
|
File without changes
|
File without changes
|