educommon 3.11.3__py3-none-any.whl → 3.13.0__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.
- educommon/contingent/catalogs.py +35 -20
- educommon/django/db/signals.py +147 -2
- educommon/version.conf +5 -5
- {educommon-3.11.3.dist-info → educommon-3.13.0.dist-info}/METADATA +2 -4
- {educommon-3.11.3.dist-info → educommon-3.13.0.dist-info}/RECORD +8 -8
- {educommon-3.11.3.dist-info → educommon-3.13.0.dist-info}/WHEEL +1 -1
- {educommon-3.11.3.dist-info → educommon-3.13.0.dist-info}/dependency_links.txt +0 -0
- {educommon-3.11.3.dist-info → educommon-3.13.0.dist-info}/top_level.txt +0 -0
educommon/contingent/catalogs.py
CHANGED
@@ -863,8 +863,7 @@ class IdentityDocumentsTypes(BaseEnumerate):
|
|
863
863
|
|
864
864
|
@classmethod
|
865
865
|
def __append_to_result(cls, item, result):
|
866
|
-
"""
|
867
|
-
Добавляет значения к результирующему списку.
|
866
|
+
"""Добавляет значения к результирующему списку.
|
868
867
|
|
869
868
|
:param item: tuple, например (ключ1, ("значение", УФТТ код))
|
870
869
|
:param result: [(key1, value1), (key2, value2), .. (keyN, valueN)]
|
@@ -890,29 +889,45 @@ class AdaptationType(BaseEnumerate):
|
|
890
889
|
RETARDED_HARD = 210
|
891
890
|
OTHER = 211
|
892
891
|
AUTISTIC_DISORDER = 212
|
892
|
+
HEARING_IMPAIRED = 213
|
893
|
+
MENTAL_RETARDATION = 214
|
893
894
|
|
894
895
|
values = {
|
895
|
-
HALF_BLIND:
|
896
|
-
BLIND:
|
897
|
-
HALF_DEAF:
|
898
|
-
DEAF:
|
896
|
+
HALF_BLIND: 'Для слабовидящих детей',
|
897
|
+
BLIND: 'Для слепых детей',
|
898
|
+
HALF_DEAF: 'Для слабослышащих',
|
899
|
+
DEAF: 'Для глухих детей',
|
899
900
|
HALF_DEAF_HARD:
|
900
|
-
|
901
|
-
|
902
|
-
WEAK:
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
901
|
+
'Для слабослышащих обучающихся, имеющих сложную структуру '
|
902
|
+
'дефекта (нарушение слуха и задержка психического развития)',
|
903
|
+
WEAK: 'Для детей с нарушениями опорно-двигательного аппарата',
|
904
|
+
SPEECH_PATHOLOGY: 'Для детей с тяжёлыми нарушениями речи',
|
905
|
+
DELAYED: 'Для детей с задержкой психического развития',
|
906
|
+
RETARDED: 'Для обучающихся с умственной отсталостью',
|
907
|
+
RETARDED_HARD: 'Для обучающихся с умственной отсталостью, имеющих сложную структуру дефекта',
|
908
|
+
OTHER: 'Для обучающихся с иными ограничениями здоровья',
|
909
|
+
AUTISTIC_DISORDER: 'Для детей с расстройством аутистического спектра',
|
910
|
+
HEARING_IMPAIRED: 'Для слабослышащих и позднооглохших детей',
|
911
|
+
MENTAL_RETARDATION: 'Для детей с умственной отсталостью, нарушением интеллекта',
|
912
|
+
}
|
913
|
+
|
914
|
+
epgu_codes = {
|
915
|
+
DEAF: 1,
|
916
|
+
HEARING_IMPAIRED: 2,
|
917
|
+
BLIND: 3,
|
918
|
+
HALF_BLIND: 4,
|
919
|
+
SPEECH_PATHOLOGY: 5,
|
920
|
+
WEAK: 6,
|
921
|
+
DELAYED: 7,
|
922
|
+
AUTISTIC_DISORDER: 8,
|
923
|
+
MENTAL_RETARDATION: 9,
|
914
924
|
}
|
915
925
|
|
926
|
+
@classmethod
|
927
|
+
def get_epgu_code(cls, adaptation_type):
|
928
|
+
"""Возвращает код ЕПГУ для заданного типа адаптации, если он существует."""
|
929
|
+
return cls.epgu_codes.get(adaptation_type)
|
930
|
+
|
916
931
|
|
917
932
|
class TypeTrainingLongTermTreatment(BaseEnumerate):
|
918
933
|
"""Справочник "Виды обучения при длительном лечении"."""
|
educommon/django/db/signals.py
CHANGED
@@ -1,7 +1,152 @@
|
|
1
|
+
from typing import (
|
2
|
+
Callable,
|
3
|
+
Optional,
|
4
|
+
)
|
5
|
+
|
6
|
+
from django.db.models import (
|
7
|
+
Model,
|
8
|
+
)
|
1
9
|
from django.dispatch.dispatcher import (
|
2
10
|
Signal,
|
3
11
|
)
|
12
|
+
from educommon import (
|
13
|
+
logger,
|
14
|
+
)
|
15
|
+
|
16
|
+
|
17
|
+
class BaseBeforeMigrateHandler:
|
18
|
+
"""
|
19
|
+
Базовый обработчик сигнала before_handle_migrate_signal.
|
20
|
+
|
21
|
+
Должен быть унаследован и инстанс наследника регистрироваться
|
22
|
+
как обработчик сигнала.
|
23
|
+
"""
|
24
|
+
|
25
|
+
def _is_accessing_non_migrating_databases(self, migrating_database: str) -> bool:
|
26
|
+
for model_cls in self._get_working_models():
|
27
|
+
db = self._get_model_db(model_cls)
|
28
|
+
if db != migrating_database:
|
29
|
+
return True
|
30
|
+
|
31
|
+
return False
|
32
|
+
|
33
|
+
def _get_model_db(self, model_cls: type[Model]) -> str:
|
34
|
+
"""
|
35
|
+
Возвращает псевдоним базы данных, к которой пойдет запрос
|
36
|
+
по данной модели.
|
37
|
+
"""
|
38
|
+
|
39
|
+
return model_cls.objects.all().db
|
40
|
+
|
41
|
+
def _get_migrating_database(self, sender) -> str:
|
42
|
+
"""Возвращает псевдоним базы данных, с которой работает миграция."""
|
43
|
+
|
44
|
+
return sender.database
|
45
|
+
|
46
|
+
def _get_working_models(self) -> set[type[Model]]:
|
47
|
+
"""Модели, с которым будет работать обработчик сигнала."""
|
48
|
+
|
49
|
+
raise NotImplementedError()
|
50
|
+
|
51
|
+
def handler(self, sender, *args, **kwargs):
|
52
|
+
"""Непосредственный обработчик сигнала."""
|
53
|
+
|
54
|
+
raise NotImplementedError()
|
55
|
+
|
56
|
+
def __call__(self, sender, *args, **kwargs):
|
57
|
+
migrating_database = self._get_migrating_database(sender)
|
58
|
+
if self._is_accessing_non_migrating_databases(migrating_database):
|
59
|
+
logger.warning('Предотвращена попытка доступа к базе данных, по которой не производится миграция')
|
60
|
+
return
|
61
|
+
|
62
|
+
return self.handler(sender, *args, **kwargs)
|
63
|
+
|
64
|
+
|
65
|
+
class BaseAfterMigrateHandler:
|
66
|
+
"""
|
67
|
+
Базовый обработчик сигнала after_handle_migrate_signal.
|
68
|
+
|
69
|
+
Должен быть унаследован и инстанс наследника регистрироваться
|
70
|
+
как обработчик сигнала.
|
71
|
+
"""
|
72
|
+
|
73
|
+
def _is_accessing_non_migrating_databases(self, migrating_database: str) -> bool:
|
74
|
+
for model_cls in self._get_working_models():
|
75
|
+
db = self._get_model_db(model_cls)
|
76
|
+
if db != migrating_database:
|
77
|
+
return True
|
78
|
+
|
79
|
+
return False
|
80
|
+
|
81
|
+
def _get_model_db(self, model_cls: type[Model]) -> str:
|
82
|
+
"""
|
83
|
+
Возвращает псевдоним базы данных, к которой пойдет запрос
|
84
|
+
по данной модели.
|
85
|
+
"""
|
86
|
+
|
87
|
+
return model_cls.objects.all().db
|
88
|
+
|
89
|
+
def _get_migrating_database(self, sender) -> str:
|
90
|
+
"""Возвращает псевдоним базы данных, с которой работает миграция."""
|
91
|
+
|
92
|
+
return sender.database
|
93
|
+
|
94
|
+
def _get_working_models(self) -> set[type[Model]]:
|
95
|
+
"""Модели, с которым будет работать обработчик сигнала."""
|
96
|
+
|
97
|
+
raise NotImplementedError()
|
98
|
+
|
99
|
+
def handler(self, sender, *args, **kwargs):
|
100
|
+
"""Непосредственный обработчик сигнала."""
|
101
|
+
|
102
|
+
raise NotImplementedError()
|
103
|
+
|
104
|
+
def __call__(self, sender, *args, **kwargs):
|
105
|
+
migrating_database = self._get_migrating_database(sender)
|
106
|
+
if self._is_accessing_non_migrating_databases(migrating_database):
|
107
|
+
logger.warning('Предотвращена попытка доступа к базе данных, по которой не производится миграция')
|
108
|
+
return
|
109
|
+
|
110
|
+
return self.handler(sender, *args, **kwargs)
|
111
|
+
|
112
|
+
|
113
|
+
class BeforeHandleMigrateSignal(Signal):
|
114
|
+
_handler_base_class = BaseBeforeMigrateHandler
|
115
|
+
|
116
|
+
def connect(
|
117
|
+
self,
|
118
|
+
receiver: Callable,
|
119
|
+
sender: Optional = None,
|
120
|
+
weak: bool = True,
|
121
|
+
dispatch_uid: Optional[str] = None,
|
122
|
+
) -> None:
|
123
|
+
if not isinstance(receiver, self._handler_base_class):
|
124
|
+
logger.warning(
|
125
|
+
f'Обработчик сигнала before_handle_migrate_signal {receiver} не зарегистрирован, поскольку '
|
126
|
+
f'он не является подклассом {self._handler_base_class.__name__}'
|
127
|
+
)
|
128
|
+
|
129
|
+
return super().connect(receiver, sender, weak, dispatch_uid)
|
130
|
+
|
131
|
+
|
132
|
+
class AfterHandleMigrateSignal(Signal):
|
133
|
+
_handler_base_class = BaseBeforeMigrateHandler
|
134
|
+
|
135
|
+
def connect(
|
136
|
+
self,
|
137
|
+
receiver: Callable,
|
138
|
+
sender: Optional = None,
|
139
|
+
weak: bool = True,
|
140
|
+
dispatch_uid: Optional[str] = None,
|
141
|
+
) -> None:
|
142
|
+
if not isinstance(receiver, self._handler_base_class):
|
143
|
+
logger.warning(
|
144
|
+
f'Обработчик сигнала after_handle_migrate_signal {receiver} не зарегистрирован, поскольку '
|
145
|
+
f'он не является подклассом {self._handler_base_class.__name__}'
|
146
|
+
)
|
147
|
+
|
148
|
+
return super().connect(receiver, sender, weak, dispatch_uid)
|
4
149
|
|
5
150
|
|
6
|
-
before_handle_migrate_signal =
|
7
|
-
after_handle_migrate_signal =
|
151
|
+
before_handle_migrate_signal = BeforeHandleMigrateSignal()
|
152
|
+
after_handle_migrate_signal = AfterHandleMigrateSignal()
|
educommon/version.conf
CHANGED
@@ -4,8 +4,8 @@
|
|
4
4
|
# нормальной установки обновлений.
|
5
5
|
|
6
6
|
[version]
|
7
|
-
BRANCH = tags/3.
|
8
|
-
VERSION = 3.
|
9
|
-
REVISION =
|
10
|
-
VERSION_DATE =
|
11
|
-
REVISION_DATE =
|
7
|
+
BRANCH = tags/3.13.0
|
8
|
+
VERSION = 3.13.0
|
9
|
+
REVISION = 63072e48f15fed47a1f135ca1fe0e9bf3589c120
|
10
|
+
VERSION_DATE = 27.03.2025
|
11
|
+
REVISION_DATE = 27.03.2025
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: educommon
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.13.0
|
4
4
|
Summary: Общая кодовая база для проектов БЦ Образование
|
5
5
|
Home-page: https://stash.bars-open.ru/projects/EDUBASE/repos/educommon
|
6
6
|
Author: BARS Group
|
@@ -12,8 +12,6 @@ Classifier: Natural Language :: English
|
|
12
12
|
Classifier: Operating System :: OS Independent
|
13
13
|
Classifier: Development Status :: 5 - Production/Stable
|
14
14
|
Classifier: Programming Language :: Python
|
15
|
-
Classifier: Programming Language :: Python :: 3.7
|
16
|
-
Classifier: Programming Language :: Python :: 3.8
|
17
15
|
Classifier: Programming Language :: Python :: 3.9
|
18
16
|
Classifier: Framework :: Django :: 2.2
|
19
17
|
Classifier: Framework :: Django :: 3.0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
educommon/__init__.py,sha256=fvsBDL7g8HgOTd-JHOh7TSvMcnUauvGVgPuyA2Z9hUI,419
|
2
2
|
educommon/thread_data.py,sha256=n0XtdesP9H92O3rJ8K6fVnJLiHqyJEfh2xpuT36wzxs,61
|
3
|
-
educommon/version.conf,sha256=
|
3
|
+
educommon/version.conf,sha256=0lvGb_lFBCjDdceu6N0siB06AZLkq9Q5dViDH4XYISQ,450
|
4
4
|
educommon/about/README.rst,sha256=U48UW5jv-8qHyaV56atzzkNMvzHKXVcWSb_NR06PnMo,2685
|
5
5
|
educommon/about/__init__.py,sha256=H1W0IgW-qX9LCZ49GOJzHdmQGHhh-MA6U1xmNx7WnfM,132
|
6
6
|
educommon/about/apps.py,sha256=GrpJAOE2sF0ukWsqugP_WJS88DO4aL-T3kTLprrJrcA,259
|
@@ -120,7 +120,7 @@ educommon/contingent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
120
120
|
educommon/contingent/actions.py,sha256=zcKKUvpWJrm32q0q96oILqVIWMaqaO8T3_sbu0Z6KO0,3233
|
121
121
|
educommon/contingent/app_meta.py,sha256=4VE-PqRFLs8vLkaowIHbDyVb_9dvCScml3WvZ24KDws,273
|
122
122
|
educommon/contingent/base.py,sha256=pGpYqTuJ9XyKpK7PKZZAngURlb7-YQx-wCZKAhYhYQA,6854
|
123
|
-
educommon/contingent/catalogs.py,sha256=
|
123
|
+
educommon/contingent/catalogs.py,sha256=tUQSjDF0oWD4I7SUF48PwFg0tZbtQP5tUiWtR6zyY7Q,62092
|
124
124
|
educommon/contingent/contingent_plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
125
125
|
educommon/contingent/contingent_plugin/actions.py,sha256=SXjFCDGyFHrOZNcroEouRLZB7NqFSs7M_1Gw89bfe48,717
|
126
126
|
educommon/contingent/contingent_plugin/apps.py,sha256=2RustoCdwosXEIXpXlgK1UVfFvx729K_lP6F6l8xCr8,810
|
@@ -142,7 +142,7 @@ educommon/django/db/fields.py,sha256=a_CCuDthg9Gv_T3Ngm93Iz6kTFNo1LJMnk2-PFKohsM
|
|
142
142
|
educommon/django/db/models.py,sha256=mNtrj3MZYCXJJ2alw5TaIiN_fFjsCUrm8OCeuZ9isWI,2107
|
143
143
|
educommon/django/db/observer.py,sha256=oAh0Uu0fwlGZ4pj1ytKZyAhosbWKs4THGBTVyR4NYmA,10990
|
144
144
|
educommon/django/db/routers.py,sha256=Zx8cIf7ZQpQLVhxutNj31_IQqYS6J3MnuBTOA5m43SQ,3268
|
145
|
-
educommon/django/db/signals.py,sha256=
|
145
|
+
educommon/django/db/signals.py,sha256=XADIWMLtoAEgHX74yBw8nrHhbePQxmwBdpgw0PwN1F0,5511
|
146
146
|
educommon/django/db/utils.py,sha256=S9rZhfLn4GYWXiVOPSsEGl382NzUFeOxh-G7OtB43vE,9206
|
147
147
|
educommon/django/db/migration/__init__.py,sha256=FwICNxrFGFwzy5klIKzYIhVpsunLipS4W8ysS8C0z5k,1882
|
148
148
|
educommon/django/db/migration/operations.py,sha256=R_SCK8R1IF6x5qjJPoTnGjiAedqnBT-OpaEjyyJaxVM,9527
|
@@ -350,8 +350,8 @@ educommon/ws_log/smev/exceptions.py,sha256=lmy7o2T3dJkqgIhG07qyh5yPqO3qZAYABuT4J
|
|
350
350
|
educommon/ws_log/templates/report/smev_logs.xlsx,sha256=nnYgB0Z_ix8HoxsRICjsZfFRQBdra-5Gd8nWhCxTjYg,10439
|
351
351
|
educommon/ws_log/templates/ui-js/smev-logs-list-window.js,sha256=AGup3D8GTJSY9WdDPj0zBJeYQBFOmGgcbxPOJbKK-nY,513
|
352
352
|
educommon/ws_log/templates/ui-js/smev-logs-report-setting-window.js,sha256=nQ7QYK9frJcE7g7kIt6INg9TlEEJAPPayBJgRaoTePA,1103
|
353
|
-
educommon-3.
|
354
|
-
educommon-3.
|
355
|
-
educommon-3.
|
356
|
-
educommon-3.
|
357
|
-
educommon-3.
|
353
|
+
educommon-3.13.0.dist-info/METADATA,sha256=_zlgm_31M00zT6LvfzhGekdF9S6_2bNQxlxiFq5eleI,1566
|
354
|
+
educommon-3.13.0.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
355
|
+
educommon-3.13.0.dist-info/dependency_links.txt,sha256=RNlr4t-BxZRm7e_IfVo1ikr5ln-7viimzLHvQMO1C_Q,43
|
356
|
+
educommon-3.13.0.dist-info/top_level.txt,sha256=z5fbW7bz_0V1foUm_FGcZ9_MTpW3N1dBN7-kEmMowl4,10
|
357
|
+
educommon-3.13.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|