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.
- educommon/django/db/signals.py +147 -2
- educommon/version.conf +5 -5
- {educommon-3.12.0.dist-info → educommon-3.13.0.dist-info}/METADATA +2 -4
- {educommon-3.12.0.dist-info → educommon-3.13.0.dist-info}/RECORD +7 -7
- {educommon-3.12.0.dist-info → educommon-3.13.0.dist-info}/WHEEL +1 -1
- {educommon-3.12.0.dist-info → educommon-3.13.0.dist-info}/dependency_links.txt +0 -0
- {educommon-3.12.0.dist-info → educommon-3.13.0.dist-info}/top_level.txt +0 -0
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
|
@@ -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
|