arpakitlib 1.8.109__py3-none-any.whl → 1.8.111__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,4 +1,4 @@
1
1
  {
2
2
  "arpakitlib_project_template_version": "5",
3
- "arpakitlib_project_template_subversion": "24"
3
+ "arpakitlib_project_template_subversion": "26"
4
4
  }
@@ -1,5 +1,14 @@
1
+ import datetime as dt
2
+ import io
3
+ import json
4
+ from typing import Any, List
5
+
6
+ import starlette.responses
7
+ from openpyxl import Workbook
1
8
  from sqladmin import ModelView
2
9
 
10
+ from project.core.util import now_local_dt
11
+
3
12
 
4
13
  class SimpleMV(ModelView):
5
14
  can_create = True
@@ -11,7 +20,53 @@ class SimpleMV(ModelView):
11
20
  page_size_options = [50, 100, 200, 500, 750, 1000]
12
21
  save_as = True
13
22
  save_as_continue = True
14
- export_types = ["xlsx", "csv", "json"]
23
+ export_types = ["xlsx"]
24
+
25
+ async def export_data(
26
+ self,
27
+ data: List[Any],
28
+ export_type: str = "csv",
29
+ ) -> starlette.responses.StreamingResponse:
30
+ if export_type == "xlsx":
31
+ return await self.export_data_into_xlsx(data=data)
32
+ else:
33
+ return await super().export_data(data=data, export_type=export_type)
34
+
35
+ async def export_data_into_xlsx(self, data: list[Any]) -> starlette.responses.StreamingResponse:
36
+ wb = Workbook()
37
+ wb.active.title = f"{self.model.__name__}"
38
+ wb.active.append(self.get_list_columns())
39
+
40
+ for d in data:
41
+ wb.active.append([
42
+ self._serialize_value_for_export_data_into_xlsx(getattr(d, column_name, ""))
43
+ for column_name in self.get_list_columns()
44
+ ])
45
+
46
+ output = io.BytesIO()
47
+ wb.save(output)
48
+ output.seek(0)
49
+
50
+ filename = f"{self.model.__name__}_export_{now_local_dt().strftime("%d.%m.%YT%H-%M-%S-%Z%z")}.xlsx"
51
+
52
+ return starlette.responses.StreamingResponse(
53
+ output,
54
+ media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
55
+ headers={
56
+ "Content-Disposition": f"attachment; filename=\"{filename}\""
57
+ },
58
+ )
59
+
60
+ def _serialize_value_for_export_data_into_xlsx(self, value: Any) -> str:
61
+ if value is None:
62
+ return ""
63
+ if isinstance(value, dt.datetime):
64
+ return value.strftime("%d.%m.%Y %H:%M:%S %Z%z")
65
+ if isinstance(value, dt.date):
66
+ return value.strftime("%d.%m.%Y")
67
+ if isinstance(value, (dict, list)):
68
+ return json.dumps(value, ensure_ascii=False, default=str)
69
+ return str(value)
15
70
 
16
71
 
17
72
  def get_simple_mv_class() -> type[SimpleMV]:
@@ -43,7 +43,7 @@ class OperationMV(SimpleMV, model=OperationDBM):
43
43
  form_args = {
44
44
  OperationDBM.status.key: {
45
45
  "choices": [(status, status) for status in OperationDBM.Statuses.values_list()],
46
- "description": "Выберите статус"
46
+ "description": "Choose status"
47
47
  }
48
48
  }
49
49
  column_sortable_list = sqlalchemy.inspect(OperationDBM).columns
@@ -43,7 +43,7 @@ class UserMV(SimpleMV, model=UserDBM):
43
43
  form_args = {
44
44
  UserDBM.roles.key: {
45
45
  "choices": [(role, role) for role in UserDBM.Roles.values_list()],
46
- "description": "Выберите роли пользователя"
46
+ "description": "Choose user roles"
47
47
  }
48
48
  }
49
49
  column_sortable_list = sqlalchemy.inspect(UserDBM).columns
@@ -48,7 +48,7 @@ class UserTokenMV(SimpleMV, model=UserTokenDBM):
48
48
  form_ajax_refs = {
49
49
  UserTokenDBM.user.key: {
50
50
  "fields": [UserDBM.id.key, UserDBM.email.key],
51
- "placeholder": 'Search by id or email',
51
+ "placeholder": "Search by id or email",
52
52
  "minimum_input_length": 1,
53
53
  "page_size": 10,
54
54
  }
@@ -39,7 +39,7 @@ class VerificationCodeMV(SimpleMV, model=VerificationCodeDBM):
39
39
  form_args = {
40
40
  VerificationCodeDBM.type.key: {
41
41
  "choices": [(status, status) for status in VerificationCodeDBM.Types.values_list()],
42
- "description": "Выберите тип"
42
+ "description": "Choose type"
43
43
  }
44
44
  }
45
45
  column_sortable_list = sqlalchemy.inspect(VerificationCodeDBM).columns
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.8.109
3
+ Version: 1.8.111
4
4
  Summary: arpakitlib
5
5
  License: Apache-2.0
6
6
  Keywords: arpakitlib,arpakit,arpakit-company,arpakitcompany,arpakit_company
@@ -8,7 +8,7 @@ arpakitlib/_arpakit_project_template_v_5/alembic/env.py,sha256=Qesmnj5A2kB-Doeuf
8
8
  arpakitlib/_arpakit_project_template_v_5/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
9
9
  arpakitlib/_arpakit_project_template_v_5/alembic/versions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  arpakitlib/_arpakit_project_template_v_5/alembic.ini,sha256=8fuyeEvGBiPGbxEFy8ISBV3xX_fgVmuhEGpB10_B5Uo,3733
11
- arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=rqII_y4Uc4rsf3NPxaIMjyTBO2LmKeQxG1JaQIxxNLA,98
11
+ arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=o3UxTcbS0YBkewD0pMMAWC8bJGs-V6tzvpFhgw0useE,98
12
12
  arpakitlib/_arpakit_project_template_v_5/command/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  arpakitlib/_arpakit_project_template_v_5/command/alembic_history.sh,sha256=OMnDNtHIksGh9iavWnzbtxcudZW4vjdcISsBXvzZSPw,22
14
14
  arpakitlib/_arpakit_project_template_v_5/command/alembic_revision_autogenerate.sh,sha256=yW2i-SBOtBx15Ya0poVQqKkJM5t2JZp06r9AEW-DmGE,46
@@ -233,12 +233,12 @@ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/create_sqladmin_app.p
233
233
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/event.py,sha256=LjAUYNlsX9Sj_QLMzYuTQbbYYbIMHhbsSjTXt-G7lOE,849
234
234
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/__init__.py,sha256=dc_swzjkRDj85SWQ3cGGgsrp_cq5evUYQYUg0g7C5nw,435
235
235
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/api_key.py,sha256=VZKCG2GQworbmB_PPHPU10qMf5IThP0LN27k50XlHlg,1570
236
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py,sha256=US1tueTCPvAdse6TLT6yRLUHbvwGGagApYhFJzE_6Yc,576
237
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py,sha256=hvgKAQgNJWTcvu_ZI9Ony4I-Mm_4rZBtQ4iqnoHZc2Q,2801
236
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py,sha256=StdbfHZ92qAP-l2lnvAeyYCaZuMHKskHq1E19zJh6MA,2471
237
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py,sha256=4BFJEp_yIpZltfEjsBC__J_BfgIBYzOc6LeoWFxP1MI,2785
238
238
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/story_log.py,sha256=8N9ahbCzNVczqgO_g0luRqP8luCv5bmCLoz66UYZ0mU,1427
239
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user.py,sha256=KFiEFa0EDTxPa79B870fB5Jw-mabR-Ly8nZY9PwuAu0,2017
240
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user_token.py,sha256=X2oZzcHHGQmdZwfK4agxxjH8_qRTyZvGvhq8yKZbsJg,1789
241
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/verification_code.py,sha256=h5gTdihFjxhIfys55yJhQQcjukO_pJzWAmsf_k1ibQI,2171
239
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user.py,sha256=-QxTreqrSZkIUDrTWkkTH8jI--tH7kXwpWq9TRn_1X4,1984
240
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user_token.py,sha256=gGhpfqwydZ5VA6vdvNblp3NQHqXZLd1K3OxcYVU1SoM,1789
241
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/verification_code.py,sha256=_uuBUTkV7cAhHxaBVYk8JSp5voATOc-Kgq36-nC_o-w,2159
242
242
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
243
243
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/util/etc.py,sha256=jm65ZB0K8e6WpgcL2Y6pxcIuQjioIyMtBIOOFbbWfgk,1070
244
244
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -392,8 +392,8 @@ arpakitlib/ar_ssh_runner_util.py,sha256=yvAwza480MkHKvLkDEsR7JNh2bYNs6P9rCVo4NA8
392
392
  arpakitlib/ar_str_util.py,sha256=CAv0wH8nP5Ja59S-hEdmNhNrM_Fwy935d0zntLpJkx8,4309
393
393
  arpakitlib/ar_type_util.py,sha256=Cs_tef-Fc5xeyAF54KgISCsP11NHyzIsglm4S3Xx7iM,4049
394
394
  arpakitlib/ar_yookassa_api_client_util.py,sha256=VozuZeCJjmLd1zj2BdC9WfiAQ3XYOrIMsdpNK-AUlm0,5347
395
- arpakitlib-1.8.109.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
396
- arpakitlib-1.8.109.dist-info/METADATA,sha256=Uag9wA0Xs2FDQoDvgU3s4g1FSQ8uKU1ZeZ1kmIK_hn8,3566
397
- arpakitlib-1.8.109.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
398
- arpakitlib-1.8.109.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
399
- arpakitlib-1.8.109.dist-info/RECORD,,
395
+ arpakitlib-1.8.111.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
396
+ arpakitlib-1.8.111.dist-info/METADATA,sha256=Mjct-ehVPyOyZIp4nDKE5oJWtPvFcdJ_X2JmNcy45uI,3566
397
+ arpakitlib-1.8.111.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
398
+ arpakitlib-1.8.111.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
399
+ arpakitlib-1.8.111.dist-info/RECORD,,