educommon 3.12.0__py3-none-any.whl → 3.13.2__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/__init__.py +0 -1
- educommon/about/ui/actions.py +16 -30
- educommon/about/ui/ui.py +3 -12
- educommon/about/utils.py +6 -5
- educommon/async_task/__init__.py +0 -1
- educommon/async_task/actions.py +18 -13
- educommon/async_task/apps.py +4 -0
- educommon/async_task/locker.py +2 -5
- educommon/async_task/migrations/0001_initial.py +55 -9
- educommon/async_task/migrations/0002_task_type_and_status_data.py +94 -89
- educommon/async_task/migrations/0003_alter_runningtask_options.py +0 -1
- educommon/async_task/models.py +9 -6
- educommon/async_task/tasks.py +11 -7
- educommon/async_task/ui.py +16 -35
- educommon/async_tasks/__init__.py +0 -1
- educommon/async_tasks/apps.py +4 -0
- educommon/async_tasks/locks.py +11 -21
- educommon/async_tasks/migrations/0001_initial.py +68 -8
- educommon/async_tasks/migrations/0002_load_initial_data.py +0 -1
- educommon/async_tasks/models.py +9 -29
- educommon/async_tasks/tasks.py +25 -54
- educommon/audit_log/__init__.py +1 -0
- educommon/audit_log/actions.py +27 -36
- educommon/audit_log/app_meta.py +7 -4
- educommon/audit_log/apps.py +44 -29
- educommon/audit_log/constants.py +7 -4
- educommon/audit_log/error_log/actions.py +1 -3
- educommon/audit_log/helpers.py +2 -4
- educommon/audit_log/management/commands/reinstall_audit_log.py +11 -7
- educommon/audit_log/migrations/0001_initial.py +91 -16
- educommon/audit_log/migrations/0002_install_audit_log.py +13 -13
- educommon/audit_log/migrations/0003_logproxy.py +1 -3
- educommon/audit_log/migrations/0004_reinstall_audit_log.py +1 -4
- educommon/audit_log/migrations/0005_postgresql_error.py +4 -2
- educommon/audit_log/migrations/0006_auto_20200806_1707.py +3 -4
- educommon/audit_log/migrations/0007_create_selective_tables_function.py +8 -5
- educommon/audit_log/migrations/0008_table_logged.py +0 -1
- educommon/audit_log/migrations/0009_reinstall_audit_log.py +0 -1
- educommon/audit_log/models.py +36 -42
- educommon/audit_log/permissions.py +11 -9
- educommon/audit_log/proxies.py +12 -23
- educommon/audit_log/ui.py +18 -15
- educommon/audit_log/utils/__init__.py +28 -60
- educommon/audit_log/utils/operations.py +16 -2
- educommon/auth/__init__.py +0 -3
- educommon/auth/rbac/__init__.py +2 -4
- educommon/auth/rbac/actions.py +148 -145
- educommon/auth/rbac/app_meta.py +9 -6
- educommon/auth/rbac/backends/base.py +2 -8
- educommon/auth/rbac/backends/caching.py +27 -37
- educommon/auth/rbac/backends/simple.py +1 -4
- educommon/auth/rbac/checker.py +1 -3
- educommon/auth/rbac/management/commands/rbac.py +6 -11
- educommon/auth/rbac/manager.py +18 -47
- educommon/auth/rbac/migrations/0001_initial.py +73 -12
- educommon/auth/rbac/migrations/0002_model_modifier_metaclass_fix.py +7 -6
- educommon/auth/rbac/migrations/0003_permission_hidden.py +1 -5
- educommon/auth/rbac/migrations/0004_auto_20171024_1245.py +26 -19
- educommon/auth/rbac/models.py +63 -68
- educommon/auth/rbac/permissions.py +6 -7
- educommon/auth/rbac/ui.py +83 -84
- educommon/auth/rbac/utils.py +10 -11
- educommon/auth/rbac/validators.py +4 -5
- educommon/auth/simple_auth/__init__.py +1 -5
- educommon/auth/simple_auth/actions.py +79 -92
- educommon/auth/simple_auth/app_meta.py +2 -9
- educommon/auth/simple_auth/checkers.py +3 -3
- educommon/auth/simple_auth/migrations/0001_initial.py +23 -4
- educommon/auth/simple_auth/validators.py +0 -1
- educommon/contingent/actions.py +7 -7
- educommon/contingent/app_meta.py +1 -4
- educommon/contingent/base.py +10 -15
- educommon/contingent/catalogs.py +424 -540
- educommon/contingent/contingent_plugin/actions.py +4 -15
- educommon/contingent/contingent_plugin/apps.py +10 -4
- educommon/contingent/contingent_plugin/migrations/0001_initial.py +5 -6
- educommon/contingent/contingent_plugin/migrations/0002_add_contingent_model_deleted.py +6 -11
- educommon/contingent/contingent_plugin/model_views.py +2 -12
- educommon/contingent/contingent_plugin/models.py +2 -7
- educommon/contingent/contingent_plugin/observer.py +14 -13
- educommon/contingent/contingent_plugin/plugin_meta.py +1 -3
- educommon/contingent/contingent_plugin/storage.py +8 -7
- educommon/contingent/contingent_plugin/utils.py +6 -6
- educommon/django/db/fields.py +72 -86
- educommon/django/db/migration/__init__.py +3 -7
- educommon/django/db/migration/operations.py +29 -51
- educommon/django/db/mixins/__init__.py +16 -10
- educommon/django/db/mixins/date_interval.py +47 -75
- educommon/django/db/mixins/validation.py +26 -26
- educommon/django/db/model_view/__init__.py +18 -22
- educommon/django/db/models.py +9 -8
- educommon/django/db/observer.py +9 -27
- educommon/django/db/partitioning/__init__.py +66 -92
- educommon/django/db/partitioning/management/commands/apply_partitioning.py +3 -13
- educommon/django/db/partitioning/management/commands/clear_table.py +18 -14
- educommon/django/db/partitioning/management/commands/split_table.py +18 -13
- educommon/django/db/routers.py +6 -15
- educommon/django/db/signals.py +149 -2
- educommon/django/db/utils.py +14 -19
- educommon/django/db/validators/__init__.py +1 -0
- educommon/django/db/validators/simple.py +72 -100
- educommon/django/storages/atcfs/api.py +39 -53
- educommon/django/storages/atcfs/app_meta.py +1 -1
- educommon/django/storages/atcfs/management/commands/atcfs_migrate.py +42 -55
- educommon/django/storages/atcfs/models.py +0 -3
- educommon/django/storages/atcfs/monkey_patching.py +18 -12
- educommon/django/storages/atcfs/storage.py +14 -23
- educommon/extjs/fields/input_params.py +15 -45
- educommon/importer/XLSReader.py +143 -241
- educommon/importer/__init__.py +86 -4
- educommon/importer/api.py +53 -84
- educommon/importer/constants.py +4 -14
- educommon/importer/loggers.py +16 -26
- educommon/importer/proxy.py +131 -176
- educommon/importer/proxy_import.py +11 -12
- educommon/importer/report.py +4 -6
- educommon/importer/ui.py +32 -26
- educommon/importer/validators.py +4 -7
- educommon/integration_entities/helpers.py +14 -18
- educommon/ioc/__init__.py +3 -6
- educommon/logger/loggers.py +10 -14
- educommon/m3/__init__.py +20 -38
- educommon/m3/extensions/__init__.py +1 -0
- educommon/m3/extensions/listeners/__init__.py +22 -38
- educommon/m3/extensions/listeners/delete_check/listeners.py +31 -41
- educommon/m3/extensions/listeners/delete_check/mixins.py +20 -25
- educommon/m3/extensions/listeners/delete_check/signals.py +2 -2
- educommon/m3/extensions/listeners/delete_check/ui.py +15 -14
- educommon/m3/extensions/listeners/delete_check/utils.py +9 -11
- educommon/m3/extensions/ui.py +15 -33
- educommon/m3/transaction_context.py +17 -19
- educommon/objectpack/actions.py +70 -88
- educommon/objectpack/apps.py +5 -0
- educommon/objectpack/filters.py +9 -15
- educommon/objectpack/ui.py +59 -77
- educommon/report/__init__.py +9 -5
- educommon/report/actions.py +29 -32
- educommon/report/constructor/__init__.py +5 -8
- educommon/report/constructor/app_meta.py +1 -3
- educommon/report/constructor/apps.py +1 -0
- educommon/report/constructor/base.py +33 -80
- educommon/report/constructor/builders/excel/_base.py +138 -286
- educommon/report/constructor/builders/excel/_header.py +2 -9
- educommon/report/constructor/builders/excel/product.py +13 -34
- educommon/report/constructor/builders/excel/with_merged_cells.py +18 -14
- educommon/report/constructor/config.py +2 -0
- educommon/report/constructor/editor/actions.py +101 -215
- educommon/report/constructor/editor/ui.py +71 -93
- educommon/report/constructor/exceptions.py +6 -12
- educommon/report/constructor/migrations/0001_initial.py +36 -44
- educommon/report/constructor/migrations/0002_report_filters.py +86 -72
- educommon/report/constructor/migrations/0003_reportfilter_exclude.py +5 -5
- educommon/report/constructor/migrations/0004_reportfilter_fields.py +22 -18
- educommon/report/constructor/migrations/0005_reportcolumn_visible.py +5 -4
- educommon/report/constructor/migrations/0006_reportsorting.py +21 -17
- educommon/report/constructor/migrations/0007_include_available_units.py +14 -14
- educommon/report/constructor/migrations/0008_auto_20170407_1318.py +4 -5
- educommon/report/constructor/migrations/0009_auto_20180405_0642.py +1 -4
- educommon/report/constructor/migrations/0010_add_aggregate_fields.py +7 -8
- educommon/report/constructor/mixins.py +14 -15
- educommon/report/constructor/models.py +76 -124
- educommon/report/constructor/utils.py +3 -8
- educommon/report/constructor/validators.py +1 -3
- educommon/report/reporter.py +25 -43
- educommon/report/utils.py +14 -40
- educommon/rest/actions.py +7 -11
- educommon/rest/context.py +6 -16
- educommon/rest/controllers.py +10 -10
- educommon/rest/mixins.py +29 -27
- educommon/secure_media/app_meta.py +9 -9
- educommon/utils/__init__.py +3 -2
- educommon/utils/caching.py +1 -3
- educommon/utils/conversion.py +1 -3
- educommon/utils/crypto.py +1 -2
- educommon/utils/date.py +13 -26
- educommon/utils/db/__init__.py +17 -26
- educommon/utils/db/postgresql.py +1 -4
- educommon/utils/fonts/__init__.py +3 -4
- educommon/utils/licence/__init__.py +5 -16
- educommon/utils/misc.py +9 -18
- educommon/utils/object_grid.py +55 -62
- educommon/utils/phone_number/modelfields.py +1 -3
- educommon/utils/phone_number/phone_number.py +5 -8
- educommon/utils/phone_number/validators.py +8 -23
- educommon/utils/plugins.py +15 -28
- educommon/utils/registry.py +2 -1
- educommon/utils/seqtools.py +1 -3
- educommon/utils/serializer.py +9 -16
- educommon/utils/storage.py +3 -2
- educommon/utils/system.py +1 -3
- educommon/utils/system_app/management/commands/delete_objects.py +17 -34
- educommon/utils/ui.py +87 -84
- educommon/utils/xml/__init__.py +2 -7
- educommon/utils/xml/resolver.py +1 -0
- educommon/ws_log/actions.py +31 -76
- educommon/ws_log/base.py +6 -20
- educommon/ws_log/migrations/0001_initial.py +25 -8
- educommon/ws_log/migrations/0002_auto_20160628_1334.py +0 -1
- educommon/ws_log/migrations/0003_add_fields_to_smev_logs.py +20 -4
- educommon/ws_log/migrations/0004_auto_20160727_1600.py +7 -6
- educommon/ws_log/migrations/0005_auto_20161130_1615.py +14 -4
- educommon/ws_log/migrations/0006_auto_20170327_1027.py +3 -2
- educommon/ws_log/migrations/0007_auto_20180607_1040.py +8 -9
- educommon/ws_log/migrations/0008_auto_20180713_1445.py +23 -10
- educommon/ws_log/migrations/0009_auto_20201130_1553.py +7 -2
- educommon/ws_log/models.py +21 -35
- educommon/ws_log/provider.py +2 -1
- educommon/ws_log/report.py +8 -13
- educommon/ws_log/smev/applications.py +12 -27
- educommon/ws_log/smev/exceptions.py +2 -3
- educommon/ws_log/ui.py +32 -32
- educommon/ws_log/utils.py +1 -3
- educommon-3.13.2.dist-info/METADATA +57 -0
- educommon-3.13.2.dist-info/RECORD +354 -0
- {educommon-3.12.0.dist-info → educommon-3.13.2.dist-info}/WHEEL +1 -1
- educommon/utils/patches.py +0 -27
- educommon/version.conf +0 -11
- educommon-3.12.0.dist-info/METADATA +0 -47
- educommon-3.12.0.dist-info/RECORD +0 -357
- educommon-3.12.0.dist-info/dependency_links.txt +0 -1
- {educommon-3.12.0.dist-info → educommon-3.13.2.dist-info}/top_level.txt +0 -0
@@ -6,32 +6,36 @@ from django.db import (
|
|
6
6
|
|
7
7
|
|
8
8
|
class Migration(migrations.Migration):
|
9
|
-
|
10
|
-
|
9
|
+
dependencies = [
|
10
|
+
('report_constructor', '0003_reportfilter_exclude'),
|
11
|
+
]
|
11
12
|
|
12
13
|
operations = [
|
13
14
|
migrations.AlterField(
|
14
15
|
model_name='reportfilter',
|
15
16
|
name='operator',
|
16
17
|
field=models.PositiveSmallIntegerField(
|
17
|
-
choices=[
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
18
|
+
choices=[
|
19
|
+
(1, 'Меньше или равно'),
|
20
|
+
(2, 'Меньше'),
|
21
|
+
(3, 'Равно'),
|
22
|
+
(4, 'Больше'),
|
23
|
+
(5, 'Больше или равно'),
|
24
|
+
(6, 'Пусто'),
|
25
|
+
(7, 'Содержит'),
|
26
|
+
(8, 'Начинается с'),
|
27
|
+
(9, 'Заканчивается на'),
|
28
|
+
(10, 'Между'),
|
29
|
+
(11, 'Равно одному из'),
|
30
|
+
],
|
31
|
+
verbose_name='Оператор сравнения',
|
32
|
+
),
|
33
|
+
),
|
29
34
|
migrations.AlterField(
|
30
35
|
model_name='reportfilter',
|
31
36
|
name='values',
|
32
37
|
field=django.contrib.postgres.fields.ArrayField(
|
33
|
-
base_field=models.TextField(verbose_name='Значение'),
|
34
|
-
|
35
|
-
|
36
|
-
size=None), ),
|
38
|
+
base_field=models.TextField(verbose_name='Значение'), blank=True, null=True, size=None
|
39
|
+
),
|
40
|
+
),
|
37
41
|
]
|
@@ -5,13 +5,14 @@ from django.db import (
|
|
5
5
|
|
6
6
|
|
7
7
|
class Migration(migrations.Migration):
|
8
|
-
|
9
|
-
|
8
|
+
dependencies = [
|
9
|
+
('report_constructor', '0004_reportfilter_fields'),
|
10
|
+
]
|
10
11
|
|
11
12
|
operations = [
|
12
13
|
migrations.AddField(
|
13
14
|
model_name='reportcolumn',
|
14
15
|
name='visible',
|
15
|
-
field=models.BooleanField(
|
16
|
-
|
16
|
+
field=models.BooleanField(default=True, verbose_name='Видимость колонки в отчете'),
|
17
|
+
),
|
17
18
|
]
|
@@ -6,30 +6,34 @@ from django.db import (
|
|
6
6
|
|
7
7
|
|
8
8
|
class Migration(migrations.Migration):
|
9
|
-
|
10
|
-
|
9
|
+
dependencies = [
|
10
|
+
('report_constructor', '0005_reportcolumn_visible'),
|
11
|
+
]
|
11
12
|
|
12
13
|
operations = [
|
13
14
|
migrations.CreateModel(
|
14
15
|
name='ReportSorting',
|
15
16
|
fields=[
|
16
|
-
('id', models.AutoField(
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
(
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
17
|
+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
18
|
+
(
|
19
|
+
'direction',
|
20
|
+
models.PositiveSmallIntegerField(
|
21
|
+
choices=[(1, 'По возрастанию'), (2, 'По убыванию')], verbose_name='Направление сортировки'
|
22
|
+
),
|
23
|
+
),
|
24
|
+
('index', models.PositiveSmallIntegerField(verbose_name='Порядковый номер')),
|
25
|
+
(
|
26
|
+
'column',
|
27
|
+
models.OneToOneField(
|
28
|
+
on_delete=django.db.models.deletion.CASCADE,
|
29
|
+
to='report_constructor.ReportColumn',
|
30
|
+
verbose_name='Колонка',
|
31
|
+
),
|
32
|
+
),
|
30
33
|
],
|
31
34
|
options={
|
32
35
|
'verbose_name': 'Сортировка',
|
33
36
|
'verbose_name_plural': 'Сортировка',
|
34
|
-
},
|
37
|
+
},
|
38
|
+
),
|
35
39
|
]
|
@@ -7,32 +7,30 @@ from django.db import (
|
|
7
7
|
|
8
8
|
|
9
9
|
class Migration(migrations.Migration):
|
10
|
-
|
11
|
-
|
10
|
+
dependencies = [
|
11
|
+
('report_constructor', '0006_reportsorting'),
|
12
|
+
]
|
12
13
|
|
13
14
|
operations = [
|
14
15
|
migrations.AlterModelOptions(
|
15
16
|
name='reportsorting',
|
16
|
-
options={
|
17
|
-
|
18
|
-
'verbose_name': 'Сортировка',
|
19
|
-
'verbose_name_plural': 'Сортировка'
|
20
|
-
}, ),
|
17
|
+
options={'ordering': ('index',), 'verbose_name': 'Сортировка', 'verbose_name_plural': 'Сортировка'},
|
18
|
+
),
|
21
19
|
migrations.AddField(
|
22
20
|
model_name='reporttemplate',
|
23
21
|
name='include_available_units',
|
24
|
-
field=models.BooleanField(
|
25
|
-
|
26
|
-
verbose_name='Отображать данные по дочерним учреждениям'), ),
|
22
|
+
field=models.BooleanField(default=False, verbose_name='Отображать данные по дочерним учреждениям'),
|
23
|
+
),
|
27
24
|
migrations.AlterField(
|
28
25
|
model_name='reportfilter',
|
29
26
|
name='values',
|
30
27
|
field=django.contrib.postgres.fields.ArrayField(
|
31
|
-
base_field=models.TextField(
|
32
|
-
blank=True, null=True, verbose_name='Значение'),
|
28
|
+
base_field=models.TextField(blank=True, null=True, verbose_name='Значение'),
|
33
29
|
blank=True,
|
34
30
|
null=True,
|
35
|
-
size=None
|
31
|
+
size=None,
|
32
|
+
),
|
33
|
+
),
|
36
34
|
migrations.AlterField(
|
37
35
|
model_name='reportsorting',
|
38
36
|
name='column',
|
@@ -40,5 +38,7 @@ class Migration(migrations.Migration):
|
|
40
38
|
on_delete=django.db.models.deletion.CASCADE,
|
41
39
|
related_name='sorting',
|
42
40
|
to='report_constructor.ReportColumn',
|
43
|
-
verbose_name='Колонка'
|
41
|
+
verbose_name='Колонка',
|
42
|
+
),
|
43
|
+
),
|
44
44
|
]
|
@@ -6,13 +6,12 @@ from django.db import (
|
|
6
6
|
def delete_reports(apps, schema_editor):
|
7
7
|
"""Удаляет отчеты с несуществующими источниками данных."""
|
8
8
|
ReportTemplate = apps.get_model('report_constructor', 'ReportTemplate')
|
9
|
-
ReportTemplate.objects.filter(
|
10
|
-
data_source_name__in=('unit.Unit', 'person.Person')
|
11
|
-
).delete()
|
9
|
+
ReportTemplate.objects.filter(data_source_name__in=('unit.Unit', 'person.Person')).delete()
|
12
10
|
|
13
11
|
|
14
12
|
class Migration(migrations.Migration):
|
15
|
-
|
16
|
-
|
13
|
+
dependencies = [
|
14
|
+
('report_constructor', '0007_include_available_units'),
|
15
|
+
]
|
17
16
|
|
18
17
|
operations = [migrations.RunPython(delete_reports)]
|
@@ -5,7 +5,6 @@ from django.db import (
|
|
5
5
|
|
6
6
|
|
7
7
|
class Migration(migrations.Migration):
|
8
|
-
|
9
8
|
dependencies = [
|
10
9
|
('report_constructor', '0008_auto_20170407_1318'),
|
11
10
|
]
|
@@ -14,8 +13,6 @@ class Migration(migrations.Migration):
|
|
14
13
|
migrations.AlterField(
|
15
14
|
model_name='reporttemplate',
|
16
15
|
name='include_available_units',
|
17
|
-
field=models.BooleanField(
|
18
|
-
default=False,
|
19
|
-
verbose_name='Отображать данные по дочерним организациям'),
|
16
|
+
field=models.BooleanField(default=False, verbose_name='Отображать данные по дочерним организациям'),
|
20
17
|
),
|
21
18
|
]
|
@@ -5,7 +5,6 @@ from django.db import (
|
|
5
5
|
|
6
6
|
|
7
7
|
class Migration(migrations.Migration):
|
8
|
-
|
9
8
|
dependencies = [
|
10
9
|
('report_constructor', '0009_auto_20180405_0642'),
|
11
10
|
]
|
@@ -15,17 +14,17 @@ class Migration(migrations.Migration):
|
|
15
14
|
model_name='reportcolumn',
|
16
15
|
name='by_value',
|
17
16
|
field=models.PositiveSmallIntegerField(
|
18
|
-
blank=True,
|
19
|
-
|
20
|
-
|
21
|
-
verbose_name='Промежуточный итог'), ),
|
17
|
+
blank=True, choices=[(1, 'Количество'), (2, 'Сумма')], null=True, verbose_name='Промежуточный итог'
|
18
|
+
),
|
19
|
+
),
|
22
20
|
migrations.AddField(
|
23
21
|
model_name='reportcolumn',
|
24
22
|
name='total',
|
25
23
|
field=models.PositiveSmallIntegerField(
|
26
24
|
blank=True,
|
27
|
-
choices=[(1, 'Количество'), (2, 'Сумма'), (
|
28
|
-
3, 'Количество уникальных')],
|
25
|
+
choices=[(1, 'Количество'), (2, 'Сумма'), (3, 'Количество уникальных')],
|
29
26
|
null=True,
|
30
|
-
verbose_name='Итог'
|
27
|
+
verbose_name='Итог',
|
28
|
+
),
|
29
|
+
),
|
31
30
|
]
|
@@ -22,15 +22,19 @@ _BUILDERS_PACKAGE = 'educommon.report.constructor.builders'
|
|
22
22
|
|
23
23
|
|
24
24
|
class BuildReportTaskMixin:
|
25
|
+
"""Миксин для генерации отчётов по шаблонам.
|
26
|
+
|
27
|
+
Обеспечивает выбор нужного класса-сборщика отчёта в зависимости от формата
|
28
|
+
и шаблона, а также создание файла с отчётом и генерацию ссылки на скачивание.
|
29
|
+
"""
|
25
30
|
|
26
31
|
_builders = {
|
27
|
-
ReportTemplate.EXCEL_SIMPLE:
|
28
|
-
|
29
|
-
ReportTemplate.EXCEL_MERGED:
|
30
|
-
_BUILDERS_PACKAGE + '.excel.with_merged_cells.ReportBuilder',
|
32
|
+
ReportTemplate.EXCEL_SIMPLE: f'{_BUILDERS_PACKAGE}.excel.product.ReportBuilder',
|
33
|
+
ReportTemplate.EXCEL_MERGED: f'{_BUILDERS_PACKAGE}.excel.with_merged_cells.ReportBuilder',
|
31
34
|
}
|
32
35
|
|
33
36
|
def _get_builder(self, report_template, fmt):
|
37
|
+
"""Определяет и загружает класс-сборщик отчёта по формату шаблона."""
|
34
38
|
if report_template.format == ReportTemplate.USER_DEFINED:
|
35
39
|
report_format = fmt
|
36
40
|
else:
|
@@ -39,6 +43,7 @@ class BuildReportTaskMixin:
|
|
39
43
|
builder_name = self._builders[report_format]
|
40
44
|
module_name, _, class_name = builder_name.rpartition('.')
|
41
45
|
module = import_module(module_name)
|
46
|
+
|
42
47
|
return getattr(module, class_name)
|
43
48
|
|
44
49
|
def make_report(self, *args, **kwargs):
|
@@ -55,20 +60,14 @@ class BuildReportTaskMixin:
|
|
55
60
|
if not os.path.exists(report_dir):
|
56
61
|
os.mkdir(report_dir)
|
57
62
|
break
|
58
|
-
file_name = (
|
59
|
-
slugify(report_template.title, allow_unicode=True) + '.xlsx'
|
60
|
-
)
|
63
|
+
file_name = slugify(report_template.title, allow_unicode=True) + '.xlsx'
|
61
64
|
file_path = os.path.join(report_dir, file_name)
|
62
65
|
builder_class = self._get_builder(report_template, kwargs['format'])
|
63
|
-
user = kwargs['content_type'].get_object_for_this_type(
|
64
|
-
id=kwargs['object_id']
|
65
|
-
)
|
66
|
+
user = kwargs['content_type'].get_object_for_this_type(id=kwargs['object_id'])
|
66
67
|
builder = builder_class(report_template, file_path, user)
|
67
68
|
builder.build()
|
68
|
-
link = os.path.join(
|
69
|
-
|
70
|
-
)
|
71
|
-
download_link = '<a href="{}" target="_blank" download>{}</a>'.format(
|
72
|
-
link, file_name)
|
69
|
+
link = os.path.join(settings.MEDIA_URL, 'report_constructor', report_id, file_name)
|
70
|
+
download_link = '<a href="{}" target="_blank" download>{}</a>'.format(link, file_name)
|
73
71
|
result['download_link'] = download_link
|
72
|
+
|
74
73
|
return result
|