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.
@@ -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
- SPEECH_PATHOLOGY: "для обучающихся, имеющих тяжелые нарушения речи",
906
- DELAYED: "для обучающихся с задержкой психического развития",
907
- RETARDED: "для обучающихся с умственной отсталостью",
908
- RETARDED_HARD:
909
- "для обучающихся с умственной отсталостью, имеющих сложную "
910
- "структуру дефекта",
911
- OTHER: "для обучающихся с иными ограничениями здоровья",
912
- AUTISTIC_DISORDER:
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
  """Справочник "Виды обучения при длительном лечении"."""
@@ -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 = Signal()
7
- after_handle_migrate_signal = 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.11.3
8
- VERSION = 3.11.3
9
- REVISION = 2089fc2335f9595dd14f5fbfc289461e2f039ea4
10
- VERSION_DATE = 06.03.2025
11
- REVISION_DATE = 06.03.2025
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.2
1
+ Metadata-Version: 2.4
2
2
  Name: educommon
3
- Version: 3.11.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=FVl_Zvkg_h4v6tRzMgBy4P7k_tR6yE9hEJg5ZrK1TWg,450
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=OafO1jDi7q7wm_7cnu8k-xiUc6mwKhXE36HklJX2Sb4,61449
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=pbBr31q3hK6aBW6FZXYmATxKp8KrCuqmrNdDZNnpw38,136
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.11.3.dist-info/METADATA,sha256=04IPpdzNeAVXE9Yh8UaFlMp6KdM7KMw9TDqyP4wGrUY,1666
354
- educommon-3.11.3.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
355
- educommon-3.11.3.dist-info/dependency_links.txt,sha256=RNlr4t-BxZRm7e_IfVo1ikr5ln-7viimzLHvQMO1C_Q,43
356
- educommon-3.11.3.dist-info/top_level.txt,sha256=z5fbW7bz_0V1foUm_FGcZ9_MTpW3N1dBN7-kEmMowl4,10
357
- educommon-3.11.3.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (77.0.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5