educommon 3.12.0__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.
@@ -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.12.0^0
8
- VERSION = 3.12.0
9
- REVISION = 77c8293bb54ede8a5d5f06d376cf771c28cada88
10
- VERSION_DATE = 11.03.2025
11
- REVISION_DATE = 11.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.12.0
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=xen1bzwhKoQ5lIF3Nb7Dd54xD8sqWUWN5HjzGA8el-c,452
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
@@ -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.12.0.dist-info/METADATA,sha256=9t7lbgOOSfePEfKP9Tbsenc-NLJ06Tk4ALb3WoUe5Ag,1666
354
- educommon-3.12.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
355
- educommon-3.12.0.dist-info/dependency_links.txt,sha256=RNlr4t-BxZRm7e_IfVo1ikr5ln-7viimzLHvQMO1C_Q,43
356
- educommon-3.12.0.dist-info/top_level.txt,sha256=z5fbW7bz_0V1foUm_FGcZ9_MTpW3N1dBN7-kEmMowl4,10
357
- educommon-3.12.0.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