ramifice 0.8.32__py3-none-any.whl → 0.8.34__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.
Files changed (80) hide show
  1. ramifice/__init__.py +2 -0
  2. ramifice/commons/__init__.py +2 -0
  3. ramifice/commons/general.py +2 -0
  4. ramifice/commons/indexes.py +6 -6
  5. ramifice/commons/many.py +2 -0
  6. ramifice/commons/one.py +2 -0
  7. ramifice/commons/tools.py +7 -5
  8. ramifice/commons/unit_manager.py +2 -0
  9. ramifice/fields/__init__.py +2 -0
  10. ramifice/fields/bool_field.py +2 -0
  11. ramifice/fields/choice_float_dyn_field.py +2 -0
  12. ramifice/fields/choice_float_field.py +2 -0
  13. ramifice/fields/choice_float_mult_dyn_field.py +2 -0
  14. ramifice/fields/choice_float_mult_field.py +2 -0
  15. ramifice/fields/choice_int_dyn_field.py +2 -0
  16. ramifice/fields/choice_int_field.py +2 -0
  17. ramifice/fields/choice_int_mult_dyn_field.py +2 -0
  18. ramifice/fields/choice_int_mult_field.py +2 -0
  19. ramifice/fields/choice_text_dyn_field.py +2 -0
  20. ramifice/fields/choice_text_field.py +2 -0
  21. ramifice/fields/choice_text_mult_dyn_field.py +2 -0
  22. ramifice/fields/choice_text_mult_field.py +2 -0
  23. ramifice/fields/color_field.py +2 -0
  24. ramifice/fields/date_field.py +6 -6
  25. ramifice/fields/date_time_field.py +6 -6
  26. ramifice/fields/email_field.py +2 -0
  27. ramifice/fields/file_field.py +4 -2
  28. ramifice/fields/float_field.py +2 -0
  29. ramifice/fields/general/choice_group.py +2 -0
  30. ramifice/fields/general/date_group.py +2 -0
  31. ramifice/fields/general/field.py +2 -0
  32. ramifice/fields/general/file_group.py +2 -0
  33. ramifice/fields/general/number_group.py +2 -0
  34. ramifice/fields/general/text_group.py +2 -0
  35. ramifice/fields/id_field.py +2 -0
  36. ramifice/fields/image_field.py +5 -3
  37. ramifice/fields/integer_field.py +2 -0
  38. ramifice/fields/ip_field.py +2 -0
  39. ramifice/fields/password_field.py +5 -3
  40. ramifice/fields/phone_field.py +3 -1
  41. ramifice/fields/slug_field.py +2 -0
  42. ramifice/fields/text_field.py +3 -1
  43. ramifice/fields/url_field.py +2 -0
  44. ramifice/models/decorator.py +4 -2
  45. ramifice/models/model.py +2 -1
  46. ramifice/paladins/__init__.py +2 -0
  47. ramifice/paladins/add_valid.py +2 -0
  48. ramifice/paladins/check.py +2 -0
  49. ramifice/paladins/delete.py +2 -0
  50. ramifice/paladins/groups/__init__.py +2 -0
  51. ramifice/paladins/groups/bool_group.py +2 -0
  52. ramifice/paladins/groups/choice_group.py +2 -0
  53. ramifice/paladins/groups/date_group.py +7 -4
  54. ramifice/paladins/groups/file_group.py +20 -16
  55. ramifice/paladins/groups/id_group.py +2 -0
  56. ramifice/paladins/groups/img_group.py +20 -16
  57. ramifice/paladins/groups/num_group.py +8 -2
  58. ramifice/paladins/groups/pass_group.py +3 -1
  59. ramifice/paladins/groups/slug_group.py +2 -0
  60. ramifice/paladins/groups/text_group.py +5 -1
  61. ramifice/paladins/hooks.py +2 -0
  62. ramifice/paladins/indexing.py +2 -0
  63. ramifice/paladins/password.py +4 -3
  64. ramifice/paladins/refrash.py +2 -0
  65. ramifice/paladins/save.py +2 -0
  66. ramifice/paladins/tools.py +2 -0
  67. ramifice/paladins/validation.py +2 -0
  68. ramifice/utils/constants.py +2 -0
  69. ramifice/utils/errors.py +5 -3
  70. ramifice/utils/fixtures.py +4 -1
  71. ramifice/utils/migration.py +2 -0
  72. ramifice/utils/mixins.py +2 -0
  73. ramifice/utils/tools.py +5 -9
  74. ramifice/utils/translations.py +4 -2
  75. ramifice/utils/unit.py +2 -0
  76. {ramifice-0.8.32.dist-info → ramifice-0.8.34.dist-info}/METADATA +4 -4
  77. ramifice-0.8.34.dist-info/RECORD +83 -0
  78. ramifice-0.8.32.dist-info/RECORD +0 -83
  79. {ramifice-0.8.32.dist-info → ramifice-0.8.34.dist-info}/WHEEL +0 -0
  80. {ramifice-0.8.32.dist-info → ramifice-0.8.34.dist-info}/licenses/LICENSE +0 -0
@@ -7,6 +7,8 @@ Supported fields:
7
7
  | ChoiceFloatMultDynField | ChoiceFloatField | ChoiceFloatDynField
8
8
  """
9
9
 
10
+ from __future__ import annotations
11
+
10
12
  __all__ = ("ChoiceGroupMixin",)
11
13
 
12
14
  from typing import Any
@@ -4,6 +4,8 @@ Supported fields:
4
4
  DateTimeField | DateField
5
5
  """
6
6
 
7
+ from __future__ import annotations
8
+
7
9
  __all__ = ("DateGroupMixin",)
8
10
 
9
11
  from datetime import datetime
@@ -72,9 +74,8 @@ class DateGroupMixin:
72
74
  )
73
75
  )
74
76
  err_msg = translations._(
75
- "The date %s must not be greater than max=%s !" % value_str,
76
- max_date_str,
77
- )
77
+ "The date {} must not be greater than max={} !",
78
+ ).format(value_str, max_date_str)
78
79
  accumulate_error(err_msg, params)
79
80
  # Validation the `min_date` field attribute.
80
81
  min_date = field.min_date
@@ -105,7 +106,9 @@ class DateGroupMixin:
105
106
  locale=translations.CURRENT_LOCALE,
106
107
  )
107
108
  )
108
- err_msg = translations._("The date %s must not be less than min=%s !" % value_str, min_date_str)
109
+ err_msg = translations._(
110
+ "The date {} must not be less than min={} !",
111
+ ).format(value_str, min_date_str)
109
112
  accumulate_error(err_msg, params)
110
113
  # Insert result.
111
114
  if params["is_save"]:
@@ -3,6 +3,8 @@
3
3
  Supported fields: FileField
4
4
  """
5
5
 
6
+ from __future__ import annotations
7
+
6
8
  __all__ = ("FileGroupMixin",)
7
9
 
8
10
  from typing import Any
@@ -30,22 +32,21 @@ class FileGroupMixin:
30
32
  if not isinstance(value, (dict, type(None))):
31
33
  panic_type_error("dict | None", params)
32
34
 
33
- if not params["is_update"]:
35
+ if not params["is_update"] and value is None:
36
+ default = field.default or None
37
+ # If necessary, use the default value.
38
+ if default is not None:
39
+ params["field_data"].from_path(default)
40
+ value = params["field_data"].value
41
+ # Validation, if the field is required and empty, accumulate the error.
42
+ # ( the default value is used whenever possible )
34
43
  if value is None:
35
- default = field.default or None
36
- # If necessary, use the default value.
37
- if default is not None:
38
- params["field_data"].from_path(default)
39
- value = params["field_data"].value
40
- # Validation, if the field is required and empty, accumulate the error.
41
- # ( the default value is used whenever possible )
42
- if value is None:
43
- if field.required:
44
- err_msg = translations._("Required field !")
45
- accumulate_error(err_msg, params)
46
- if params["is_save"]:
47
- params["result_map"][field.name] = None
48
- return
44
+ if field.required:
45
+ err_msg = translations._("Required field !")
46
+ accumulate_error(err_msg, params)
47
+ if params["is_save"]:
48
+ params["result_map"][field.name] = None
49
+ return
49
50
  # Return if the current value is missing
50
51
  if value is None:
51
52
  return
@@ -67,7 +68,10 @@ class FileGroupMixin:
67
68
  return
68
69
  # Accumulate an error if the file size exceeds the maximum value.
69
70
  if value["size"] > field.max_size:
70
- err_msg = translations._("File size exceeds the maximum value %s !" % to_human_size(field.max_size))
71
+ human_size = to_human_size(field.max_size)
72
+ err_msg = translations._(
73
+ "File size exceeds the maximum value {} !",
74
+ ).format(human_size)
71
75
  accumulate_error(err_msg, params)
72
76
  return
73
77
  # Insert result.
@@ -4,6 +4,8 @@ Supported fields:
4
4
  IDField
5
5
  """
6
6
 
7
+ from __future__ import annotations
8
+
7
9
  __all__ = ("IDGroupMixin",)
8
10
 
9
11
  from typing import Any
@@ -3,6 +3,8 @@
3
3
  Supported fields: ImageField
4
4
  """
5
5
 
6
+ from __future__ import annotations
7
+
6
8
  __all__ = ("ImgGroupMixin",)
7
9
 
8
10
  from asyncio import to_thread
@@ -29,22 +31,21 @@ class ImgGroupMixin:
29
31
  if not isinstance(value, (dict, type(None))):
30
32
  panic_type_error("dict | None", params)
31
33
 
32
- if not params["is_update"]:
34
+ if not params["is_update"] and value is None:
35
+ default = field.default or None
36
+ # If necessary, use the default value.
37
+ if default is not None:
38
+ params["field_data"].from_path(default)
39
+ value = params["field_data"].value
40
+ # Validation, if the field is required and empty, accumulate the error.
41
+ # ( the default value is used whenever possible )
33
42
  if value is None:
34
- default = field.default or None
35
- # If necessary, use the default value.
36
- if default is not None:
37
- params["field_data"].from_path(default)
38
- value = params["field_data"].value
39
- # Validation, if the field is required and empty, accumulate the error.
40
- # ( the default value is used whenever possible )
41
- if value is None:
42
- if field.required:
43
- err_msg = translations._("Required field !")
44
- accumulate_error(err_msg, params)
45
- if params["is_save"]:
46
- params["result_map"][field.name] = None
47
- return
43
+ if field.required:
44
+ err_msg = translations._("Required field !")
45
+ accumulate_error(err_msg, params)
46
+ if params["is_save"]:
47
+ params["result_map"][field.name] = None
48
+ return
48
49
  # Return if the current value is missing
49
50
  if value is None:
50
51
  return
@@ -66,7 +67,10 @@ class ImgGroupMixin:
66
67
  return
67
68
  # Accumulate an error if the file size exceeds the maximum value.
68
69
  if value["size"] > field.max_size:
69
- err_msg = translations._("Image size exceeds the maximum value %s !" % to_human_size(field.max_size))
70
+ human_size = to_human_size(field.max_size)
71
+ err_msg = translations._(
72
+ "Image size exceeds the maximum value {} !",
73
+ ).format(human_size)
70
74
  accumulate_error(err_msg, params)
71
75
  return
72
76
  # Create thumbnails.
@@ -4,6 +4,8 @@ Supported fields:
4
4
  IntegerField | FloatField
5
5
  """
6
6
 
7
+ from __future__ import annotations
8
+
7
9
  __all__ = ("NumGroupMixin",)
8
10
 
9
11
  from typing import Any
@@ -49,12 +51,16 @@ class NumGroupMixin:
49
51
  # Validation the `max_number` field attribute.
50
52
  max_number = field.max_number
51
53
  if max_number is not None and value > max_number:
52
- err_msg = translations._("The value %d must not be greater than max=%d !" % value, max_number)
54
+ err_msg = translations._(
55
+ "The value {} must not be greater than max={} !",
56
+ ).format(value, max_number)
53
57
  accumulate_error(err_msg, params)
54
58
  # Validation the `min_number` field attribute.
55
59
  min_number = field.min_number
56
60
  if min_number is not None and value < min_number:
57
- err_msg = translations._("The value %d must not be less than min=%d !" % value, min_number)
61
+ err_msg = translations._(
62
+ "The value {} must not be less than min={} !",
63
+ ).format(value, min_number)
58
64
  accumulate_error(err_msg, params)
59
65
  # Validation the `unique` field attribute.
60
66
  if field.unique and not await check_uniqueness(value, params, field_name):
@@ -3,6 +3,8 @@
3
3
  Supported fields: PasswordField
4
4
  """
5
5
 
6
+ from __future__ import annotations
7
+
6
8
  __all__ = ("PassGroupMixin",)
7
9
 
8
10
  from typing import Any
@@ -45,7 +47,7 @@ class PassGroupMixin:
45
47
  err_msg = translations._("Invalid Password !")
46
48
  accumulate_error(err_msg, params)
47
49
  chars = "a-z A-Z 0-9 - . _ ! \" ` ' # % & , : ; < > = @ { } ~ $ ( ) * + / \\ ? [ ] ^ |"
48
- err_msg = translations._("Valid characters: %s" % chars)
50
+ err_msg = translations._("Valid characters: {}").format(chars)
49
51
  accumulate_error(err_msg, params)
50
52
  err_msg = translations._("Number of characters: from 8 to 256")
51
53
  accumulate_error(err_msg, params)
@@ -4,6 +4,8 @@ Supported fields:
4
4
  SlugField
5
5
  """
6
6
 
7
+ from __future__ import annotations
8
+
7
9
  __all__ = ("SlugGroupMixin",)
8
10
 
9
11
  import logging
@@ -5,6 +5,8 @@ Supported fields:
5
5
  IPField | EmailField | ColorField
6
6
  """
7
7
 
8
+ from __future__ import annotations
9
+
8
10
  __all__ = ("TextGroupMixin",)
9
11
 
10
12
  import asyncio
@@ -63,7 +65,9 @@ class TextGroupMixin:
63
65
  # Validation the `maxlength` field attribute.
64
66
  maxlength: int | None = field.__dict__.get("maxlength")
65
67
  if maxlength is not None and len(field) > maxlength:
66
- err_msg = translations._("The length of the string exceeds maxlength=%d !" % maxlength)
68
+ err_msg = translations._(
69
+ "The length of the string exceeds maxlength={} !",
70
+ ).format(maxlength)
67
71
  accumulate_error(err_msg, params)
68
72
  # Validation the `unique` field attribute.
69
73
  if field.unique and not await check_uniqueness(
@@ -1,5 +1,7 @@
1
1
  """HooksMixin - Contains abstract methods for creating hooks."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = ("HooksMixin",)
4
6
 
5
7
  from abc import abstractmethod
@@ -1,5 +1,7 @@
1
1
  """IndexMixin - Contains abstract method for indexing the model in the database."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = ("IndexMixin",)
4
6
 
5
7
  from abc import abstractmethod
@@ -1,7 +1,10 @@
1
1
  """Verification, replacement and recoverang of password."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = ("PasswordMixin",)
4
6
 
7
+ import contextlib
5
8
  import logging
6
9
  from typing import Any
7
10
 
@@ -59,10 +62,8 @@ class PasswordMixin:
59
62
  # Password verification.
60
63
  is_valid: bool = False
61
64
  ph = PasswordHasher()
62
- try:
65
+ with contextlib.suppress(BaseException):
63
66
  is_valid = ph.verify(hash, password)
64
- except:
65
- pass
66
67
  #
67
68
  if is_valid and ph.check_needs_rehash(hash):
68
69
  hash = ph.hash(password)
@@ -1,5 +1,7 @@
1
1
  """Update Model instance from database."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = ("RefrashMixin",)
4
6
 
5
7
  import logging
ramifice/paladins/save.py CHANGED
@@ -1,5 +1,7 @@
1
1
  """Create or update document in database."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = ("SaveMixin",)
4
6
 
5
7
  import logging
@@ -1,5 +1,7 @@
1
1
  """Tool of Paladins - A set of auxiliary methods."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = (
4
6
  "ignored_fields_to_none",
5
7
  "refresh_from_mongo_doc",
@@ -1,5 +1,7 @@
1
1
  """Validation of Model and printing errors to console."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = ("ValidationMixin",)
4
6
 
5
7
  from typing import Any
@@ -15,6 +15,8 @@ List of variables:
15
15
  - `REGEX` - Caching a patterns of regular expression.
16
16
  """
17
17
 
18
+ from __future__ import annotations
19
+
18
20
  __all__ = (
19
21
  "DEBUG",
20
22
  "MONGO_CLIENT",
ramifice/utils/errors.py CHANGED
@@ -1,5 +1,7 @@
1
1
  """Custom Exceptions for Ramifice."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
 
4
6
  class RamificeException(Exception):
5
7
  """Root Exception for Ramifice."""
@@ -67,7 +69,7 @@ class ForbiddenDeleteDocError(RamificeException):
67
69
  """Exception is raised when trying to delete the document.
68
70
 
69
71
  Args:
70
- message: explanation of the error
72
+ message: explanation of the error
71
73
  """
72
74
 
73
75
  def __init__(self, message: str) -> None: # noqa: D107
@@ -79,7 +81,7 @@ class NotPossibleAddUnitError(RamificeException):
79
81
  """Exception is raised when not possible to add Unit.
80
82
 
81
83
  Args:
82
- message: explanation of the error
84
+ message: explanation of the error
83
85
  """
84
86
 
85
87
  def __init__(self, message: str) -> None: # noqa: D107
@@ -91,7 +93,7 @@ class NotPossibleDeleteUnitError(RamificeException):
91
93
  """Exception is raised when not possible to delete Unit.
92
94
 
93
95
  Args:
94
- message: explanation of the error
96
+ message: explanation of the error
95
97
  """
96
98
 
97
99
  def __init__(self, message: str) -> None: # noqa: D107
@@ -3,10 +3,13 @@
3
3
  Runs automatically during Model migration.
4
4
  """
5
5
 
6
+ from __future__ import annotations
7
+
6
8
  __all__ = ("apply_fixture",)
7
9
 
8
10
  import logging
9
11
  from datetime import datetime
12
+ from pathlib import Path
10
13
  from typing import Any
11
14
 
12
15
  import yaml
@@ -32,7 +35,7 @@ async def apply_fixture(
32
35
  fixture_path: str = f"config/fixtures/{fixture_name}.yml"
33
36
  data_yaml: dict[str, Any] | list[dict[str, Any]] | None = None
34
37
 
35
- with open(fixture_path) as file:
38
+ with Path.open(Path(fixture_path)) as file:
36
39
  data_yaml = yaml.safe_load(file)
37
40
 
38
41
  if not bool(data_yaml):
@@ -4,6 +4,8 @@ your models (add or delete a Model, add or delete a field in Model, etc.) into
4
4
  your database schema.
5
5
  """ # noqa: D205
6
6
 
7
+ from __future__ import annotations
8
+
7
9
  __all__ = ("Migration",)
8
10
 
9
11
  import logging
ramifice/utils/mixins.py CHANGED
@@ -1,5 +1,7 @@
1
1
  """Set of mixins for Models and Fields."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = ("JsonMixin",)
4
6
 
5
7
  from typing import Any
ramifice/utils/tools.py CHANGED
@@ -1,5 +1,7 @@
1
1
  """Global collection of auxiliary methods."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = (
4
6
  "is_password",
5
7
  "get_file_size",
@@ -28,9 +30,7 @@ from ramifice.utils.constants import REGEX
28
30
 
29
31
  def is_password(password: str | None) -> bool:
30
32
  """Validate Password."""
31
- if not REGEX["password"].match(str(password)):
32
- return False
33
- return True
33
+ return REGEX["password"].match(str(password)) is not None
34
34
 
35
35
 
36
36
  async def get_file_size(path: str) -> int:
@@ -73,9 +73,7 @@ async def is_email(email: str | None) -> bool:
73
73
  def is_url(url: str | None) -> bool:
74
74
  """Validate URL address."""
75
75
  result = urlparse(str(url))
76
- if not result.scheme or not result.netloc:
77
- return False
78
- return True
76
+ return not (not result.scheme or not result.netloc)
79
77
 
80
78
 
81
79
  def is_ip(address: str | int | None) -> bool:
@@ -89,9 +87,7 @@ def is_ip(address: str | int | None) -> bool:
89
87
 
90
88
  def is_color(color_code: str | None) -> bool:
91
89
  """Validate Color code."""
92
- if REGEX["color_code"].match(str(color_code)) is None:
93
- return False
94
- return True
90
+ return REGEX["color_code"].match(str(color_code)) is not None
95
91
 
96
92
 
97
93
  def is_phone(number: str | None) -> bool:
@@ -22,6 +22,8 @@ sl | sq | sr | sr_latn | sv | th | tk | tr | tt | ug | uk | vi |
22
22
  zh | zh_cn
23
23
  """
24
24
 
25
+ from __future__ import annotations
26
+
25
27
  __all__ = (
26
28
  "DEFAULT_LOCALE",
27
29
  "CURRENT_LOCALE",
@@ -56,7 +58,7 @@ def add_languages(
56
58
  languages: frozenset[str],
57
59
  ) -> None:
58
60
  """Add languages."""
59
- global DEFAULT_LOCALE, LANGUAGES
61
+ global DEFAULT_LOCALE, LANGUAGES # noqa: PLW0603
60
62
  if default_locale not in languages:
61
63
  msg = "DEFAULT_LOCALE is not included in the LANGUAGES!"
62
64
  logger.critical(msg)
@@ -155,7 +157,7 @@ def change_locale(lang_code: str) -> None:
155
157
  Returns:
156
158
  Object `None`.
157
159
  """
158
- global CURRENT_LOCALE, _, gettext, ngettext
160
+ global CURRENT_LOCALE, _, gettext, ngettext # noqa: PLW0603
159
161
  if lang_code != CURRENT_LOCALE:
160
162
  CURRENT_LOCALE = lang_code if lang_code in LANGUAGES else DEFAULT_LOCALE
161
163
  _ = get_ramifice_translator(CURRENT_LOCALE).gettext
ramifice/utils/unit.py CHANGED
@@ -1,5 +1,7 @@
1
1
  """Unit - Data management in dynamic fields."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  __all__ = ("Unit",)
4
6
 
5
7
  import logging
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ramifice
3
- Version: 0.8.32
3
+ Version: 0.8.34
4
4
  Summary: ORM-pseudo-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/
@@ -174,7 +174,7 @@ class User:
174
174
  # Hint: By default = 2 MB
175
175
  max_size=524288, # 0.5 MB = 512 KB = 524288 Bytes (in binary)
176
176
  warning=[
177
- gettext("Maximum size: %s") % to_human_size(524288),
177
+ gettext("Maximum size: {}").format(to_human_size(524288)),
178
178
  ],
179
179
  )
180
180
  self.username = TextField(
@@ -183,7 +183,7 @@ class User:
183
183
  required=True,
184
184
  unique=True,
185
185
  warning=[
186
- gettext("Allowed chars: %s") % "a-z A-Z 0-9 _",
186
+ gettext("Allowed chars: {}").format("a-z A-Z 0-9 _"),
187
187
  ],
188
188
  )
189
189
  self.password = PasswordField(
@@ -203,7 +203,7 @@ class User:
203
203
 
204
204
  # Check username
205
205
  if re.match(r"^[a-zA-Z0-9_]+$", cd.username) is None:
206
- err.update("username", gettext("Allowed chars: %s") % "a-z A-Z 0-9 _")
206
+ err.update("username", gettext("Allowed chars: {}").format("a-z A-Z 0-9 _"))
207
207
 
208
208
  # Check password
209
209
  if cd._id is None and (cd.password != cd.сonfirm_password):
@@ -0,0 +1,83 @@
1
+ ramifice/__init__.py,sha256=VWqmauH79bM0bPlbHJURZKwcOHJSEf97tpHpz5l7A8c,1622
2
+ ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ ramifice/commons/__init__.py,sha256=RR_cVDF0H8xa56q2PXGKUSmYOPF-AUNKRY9u7DHD_KU,583
4
+ ramifice/commons/general.py,sha256=zaWBzSLEaUC6Jl3uXwVKlteaGmh1Y3m1TKbRQ9YpNw0,5471
5
+ ramifice/commons/indexes.py,sha256=Y8v1L3_upl771pJG7mQkSJNwP6slGEakVvj2fZ4zloE,3655
6
+ ramifice/commons/many.py,sha256=paHeSx1aVg08C52h6b3vb-jNXqm0_zgRqxViUvqTmVo,9416
7
+ ramifice/commons/one.py,sha256=hv3gj739YKF3UWtS2Q-TFqgAkZs2du0HxMuQ0LIArJc,6993
8
+ ramifice/commons/tools.py,sha256=MCTPtOl14sIUBkp51f-nqTFVsD0iUj51G40rEFSzU20,2477
9
+ ramifice/commons/unit_manager.py,sha256=V9i3O-Z3eZKVpMUv2a_8FV0VBeHpJZWqeLRGJmtAEsg,4983
10
+ ramifice/fields/__init__.py,sha256=e1TlGRLYMo-97CNUona6EFR0svR--Wp77d_LsYhaBoo,2398
11
+ ramifice/fields/bool_field.py,sha256=efDgdK7p-ch2IHdFUuBBlW4JuogUOCD17sirqW_OBWc,2807
12
+ ramifice/fields/choice_float_dyn_field.py,sha256=nBteSr_Twtr75OKZ8H-t2hd_9dqNHq_C5bM6ZzTYCgg,3950
13
+ ramifice/fields/choice_float_field.py,sha256=ku3Jjc2lM1W2oY9KOGWbDWow6H_dcBDJh2RfR6pjpEg,4849
14
+ ramifice/fields/choice_float_mult_dyn_field.py,sha256=BHs6zuW97YWg7leweCNXhebVjnQbl0vb0mnsKbK4T_s,4017
15
+ ramifice/fields/choice_float_mult_field.py,sha256=UhdPo_XXaRA_543PtXEUTA29YYrx8poKbjb0FhSALTA,5159
16
+ ramifice/fields/choice_int_dyn_field.py,sha256=_M7SGv4-LxGF3pd8u0II-jwfxAs8_8qZTe33T6Kbe8Y,3942
17
+ ramifice/fields/choice_int_field.py,sha256=RJifV0x8-iVh9SRwkj3PSGdf1ndSjmettqfpgPrmuKA,4835
18
+ ramifice/fields/choice_int_mult_dyn_field.py,sha256=TbUNZPvEp6mYRGD1XL7xFX3Ea6VINdl1cxHvj85eWno,4011
19
+ ramifice/fields/choice_int_mult_field.py,sha256=UCoMBznMA0rdvVq1fRkiFK6Q4RyKqtKeGnWyQjDS8-8,5151
20
+ ramifice/fields/choice_text_dyn_field.py,sha256=uI5hdwntVFZMbgHys3iO0YlGATIKXLfPDdio3FL2Dv4,3933
21
+ ramifice/fields/choice_text_field.py,sha256=H7ckqvnRINqTNrEthRx00wHaWatCorjJlT8VuHOD-Qs,4995
22
+ ramifice/fields/choice_text_mult_dyn_field.py,sha256=k8pCriKlMDR2nwxStr-1H-_SP5CYofsXdw51onlW9xA,4002
23
+ ramifice/fields/choice_text_mult_field.py,sha256=QGtKbr9IM0TlDswdkpKbt7PSAdCI6J44qmuhzQJV36U,5142
24
+ ramifice/fields/color_field.py,sha256=eTWSqin6ZM1V6U9PRfEphuCdfNajFiT4nInorelWLqU,4487
25
+ ramifice/fields/date_field.py,sha256=p-pMTDpIWrK0SqUk8FVnribIEmQk37modEveytOJuKA,6255
26
+ ramifice/fields/date_time_field.py,sha256=UZLl8zvwLfytJDmrTIhpbMJVHHjg6AU_p9U0O1E0f34,6312
27
+ ramifice/fields/email_field.py,sha256=7T1ks9Plusr-fon1wa9rO7S6_Zj7J9ZmwE504UFDHx8,4427
28
+ ramifice/fields/file_field.py,sha256=G510AuGjtMerHjpUpIV6tYRShTBkNzWcI3hD_vqAGyQ,9532
29
+ ramifice/fields/float_field.py,sha256=XtyaTgAFaTem4Hv7c0G_l6LIrspraijqkEqE8G7gEE0,5834
30
+ ramifice/fields/id_field.py,sha256=pNDQRmqcsDtWVC2zW310T_3tqxpM-d3sd1elwxL14a8,4795
31
+ ramifice/fields/image_field.py,sha256=LZqDXgRLXljNUqqMSpvfPJwwiNnLB2PpSQ8F8SBNg_g,12904
32
+ ramifice/fields/integer_field.py,sha256=kZohnGFJb9YFiJ3Fl-YnPQJW1YBCAEzyavY23hl9jxc,5808
33
+ ramifice/fields/ip_field.py,sha256=FGf2Bnz87k9HRDY3SZ92OKdRb_8Z34iVq_UnP-fb7ew,4331
34
+ ramifice/fields/password_field.py,sha256=aBY8XaRCTqHGi7LfCfImoaUZuPrXmvDwquGjEkCda0A,3958
35
+ ramifice/fields/phone_field.py,sha256=mYjDkUvKStc3bJ9co5HZ2j1wzW-V8vVCkGBf1NbREwA,4622
36
+ ramifice/fields/slug_field.py,sha256=D66m1nB-gFcgYPJiFU0jBaP999RC5ng6nejpa0gV_gA,3590
37
+ ramifice/fields/text_field.py,sha256=mul51E2ZkTWDC6_b7DtF9FjA-aYuB7kxK3SaHpqmNF8,5335
38
+ ramifice/fields/url_field.py,sha256=JhbVSBpQqqoJtZX8SVEiGSNVXXi0KoWUgiQVXtNhpcc,4330
39
+ ramifice/fields/general/__init__.py,sha256=JzgIDseNQLB_IDwY9-JSiT_bONxvhJmbKl5PhQzTnpE,40
40
+ ramifice/fields/general/choice_group.py,sha256=_0f9NDACGzvxCR3rN-DGxqRGz1wjjOqracvgFzhMY5s,934
41
+ ramifice/fields/general/date_group.py,sha256=8-YqqYCjjRAmi6RkuzTxzGmxeO7UNVTuYfjFAMnXIR4,1223
42
+ ramifice/fields/general/field.py,sha256=WgfywZqsjqd6NNJ0zMS0FUXNbN2Kgvv3bJqpOxWKM8g,1398
43
+ ramifice/fields/general/file_group.py,sha256=La0gJ2PZE09CljRLMzEM1WjtAkEGXVQFiBxGpk9Jq30,1024
44
+ ramifice/fields/general/number_group.py,sha256=67BTG6GiteTVQEpiE4PXXXZP8mGhUtEqr436-iZG3ys,791
45
+ ramifice/fields/general/text_group.py,sha256=X2EkgApy_IFi48oP8YNr2SobbZlf0wi0VtyAjpaJfC0,1115
46
+ ramifice/models/__init__.py,sha256=I4p5Y_oHG9ZLZ3vR44PpCGGvB-C2W7fSQPb5qJsm-VQ,178
47
+ ramifice/models/decorator.py,sha256=9A_xEeyM0UEVeDMC8MDzvroort3dzNHxgIGWpVgQEts,6393
48
+ ramifice/models/model.py,sha256=fve4_gcv_aFMbs0yeoDuAh56JYrAtKLJZdRAX1Bhm4Y,7663
49
+ ramifice/paladins/__init__.py,sha256=ViMABU9Mnh3cL7gl8JQ8ngF4SzydrfskC8xf4MBDPso,1555
50
+ ramifice/paladins/add_valid.py,sha256=G5i2-bO0EraPyWjffVxhhmRxAse6u06iNj74X8N_RB8,477
51
+ ramifice/paladins/check.py,sha256=AVSh1v-7V_411gbiPnY4iEOu9UKq4jylR1lvyibt9tY,6946
52
+ ramifice/paladins/delete.py,sha256=NGNM-thGNaTNBq66v3opm62Cm8BdNh8q0WjIStF45M4,3728
53
+ ramifice/paladins/hooks.py,sha256=yWDmbXGU1XDHXONtUVqRHvinn4TTRqRj7jfuQieW_Rk,1095
54
+ ramifice/paladins/indexing.py,sha256=DFql_QJ8LUEK0i1K-7r7VJrTGLxHAZ2UkWvIVhg-e3g,401
55
+ ramifice/paladins/password.py,sha256=hIFRqdujn6XsScpbp6Y0pZUVMH8pk0a1zVuLWVb0j84,3355
56
+ ramifice/paladins/refrash.py,sha256=wTuwv6lXUzV29SUwiB-XqUNrvQlMmKDkK8sKpFHilaE,1259
57
+ ramifice/paladins/save.py,sha256=UfBz8i6RspNmt9YNxXMAypA4PLVPRwGDO92UsTlya3w,3712
58
+ ramifice/paladins/tools.py,sha256=6lRI9ISTC-6RJrJmwQzG6lUN3xt3UE1aPFDW5PzYr_o,2956
59
+ ramifice/paladins/validation.py,sha256=1g727ZO7E3Gj2k7qiVBMjOjdol2YGlRjxKcOsu6IPpE,1928
60
+ ramifice/paladins/groups/__init__.py,sha256=MmScWKa2cfEfowr2fUxH41VIVOkOpgz5ELTdJ8ez4Fc,996
61
+ ramifice/paladins/groups/bool_group.py,sha256=yHdjC1MknQCQ-PssQRkxhQObE7U6XjlBTk40sa54a3M,879
62
+ ramifice/paladins/groups/choice_group.py,sha256=PRuxCkDrWtoCyEhCn-WTPjub7RfoWEdSHJRyza3Nsc8,1886
63
+ ramifice/paladins/groups/date_group.py,sha256=Y2fFEX2elmE5QphDEOf-xhvmR6ryR34S9tSBpMspZY4,3846
64
+ ramifice/paladins/groups/file_group.py,sha256=2bjTiyOIb92VhHTlhhRbJv5sdZvcaCNzXoZifmJZdLU,3028
65
+ ramifice/paladins/groups/id_group.py,sha256=PnWfH1LkpduMxU9Qpm6XhC1zeKb_KQNgGAFSASQm9q0,1359
66
+ ramifice/paladins/groups/img_group.py,sha256=zy_X0uWkCwTR_3E1yMh7W970cuHfMDbfQQkYcWfI62g,6182
67
+ ramifice/paladins/groups/num_group.py,sha256=-dQeE9IpeoLZ4hWw5YjeKdhPfV8U_TIwKAiFEjYzVzA,2401
68
+ ramifice/paladins/groups/pass_group.py,sha256=jRU2tQGEJjFnOJnW1uKlgib-ffA2aVncgNjlCS_rxfM,1964
69
+ ramifice/paladins/groups/slug_group.py,sha256=zq1C-4XvL7vnM12FhzXYgDhgAgydrU1PlG70pP0pQnA,2543
70
+ ramifice/paladins/groups/text_group.py,sha256=8ejxKR0XZ7fzjnb6MwM3nyJU5GQI0Fnj9S3zJAMjqqw,4555
71
+ ramifice/utils/__init__.py,sha256=lAD90nw2VfGSuf0SLjOkeFScBPmc48XFvecueAfq73w,468
72
+ ramifice/utils/constants.py,sha256=a_sabPso9tgXnnG6fmWqNSb-3zyEGGS_lEXIqQU5nqQ,2835
73
+ ramifice/utils/errors.py,sha256=n2Fs7qZHP3w7t8Kyb1uRnNHLjuDhjD37iZe60-UM70s,2846
74
+ ramifice/utils/fixtures.py,sha256=nkrnkIEPeuswouY-cuve7uBh8-kc_J9T167UI_ZZcOQ,3496
75
+ ramifice/utils/migration.py,sha256=0yL9LwWqTentY_G57QLqQ1lOxzxqBPUvrpQNEyAjlyA,11422
76
+ ramifice/utils/mixins.py,sha256=5G3x8hK3igM7JBgCiCnVDdb_0K_D1gV1tw0QKpDlm-A,1161
77
+ ramifice/utils/tools.py,sha256=WOazw24pvL96-0yNBy7YRGErN3vAQ4F6GS9TLvWFqrs,2747
78
+ ramifice/utils/translations.py,sha256=YItvCWv-13FS2x8VYsAOH-Nx_qQOitOX7-bRGX3mc3A,4718
79
+ ramifice/utils/unit.py,sha256=zHfvkyEU4sxHOc-QMuntEcvyfQqH75AK1zx8E25kM9Y,2535
80
+ ramifice-0.8.34.dist-info/METADATA,sha256=MdcRJAzMDAo_E3nlJ4TebPPy3pIZg_dZhMGfhsWJIA0,21112
81
+ ramifice-0.8.34.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
82
+ ramifice-0.8.34.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
83
+ ramifice-0.8.34.dist-info/RECORD,,