Skip to content

Commit d772ab1

Browse files
authored
Merge pull request #553 from PROCOLLAB-github/hotfix/export_program_info
Hotfix/export program info
2 parents e8c930e + cb8c1e7 commit d772ab1

3 files changed

Lines changed: 34 additions & 2 deletions

File tree

partner_programs/serializers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ class PartnerProgramForMemberSerializer(PartnerProgramBaseSerializerMixin):
8080

8181
views_count = serializers.SerializerMethodField(method_name="count_views")
8282
links = serializers.SerializerMethodField(method_name="get_links")
83-
is_user_manager = serializers.SerializerMethodField(method_name="get_is_user_manager")
83+
is_user_manager = serializers.SerializerMethodField(
84+
method_name="get_is_user_manager"
85+
)
8486

8587
def count_views(self, program):
8688
return get_views_count(program)

partner_programs/services.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import logging
22
from collections import OrderedDict
33

4+
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
5+
46
from partner_programs.models import PartnerProgramUserProfile
57
from project_rates.models import Criteria, ProjectScore
68

@@ -132,6 +134,31 @@ def get_project_scores_info(self) -> dict[str, str]:
132134
("team_size", "Количество человек в команде"),
133135
("leader_full_name", "Имя фамилия лидера"),
134136
]
137+
EXCEL_CELL_MAX = 32767 # лимит символов в ячейке Excel
138+
139+
140+
def sanitize_excel_value(value):
141+
"""
142+
Приводит значение к безопасному для openpyxl виду:
143+
- None -> ""
144+
- для строк: вычищает запрещённые символы, нормализует переносы строк,
145+
и обрезает до лимита Excel (32767).
146+
- для чисел/булевых оставляет как есть.
147+
"""
148+
if value is None:
149+
return ""
150+
151+
if isinstance(value, (int, float, bool)):
152+
return value
153+
154+
text = str(value)
155+
text = text.replace("\r\n", "\n").replace("\r", "\n")
156+
text = ILLEGAL_CHARACTERS_RE.sub(" ", text)
157+
158+
if len(text) > EXCEL_CELL_MAX:
159+
text = text[: EXCEL_CELL_MAX - 3] + "..."
160+
161+
return text
135162

136163

137164
def _leader_full_name(user):

partner_programs/views.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
BASE_COLUMNS,
4646
build_program_field_columns,
4747
row_dict_for_link,
48+
sanitize_excel_value,
4849
)
4950
from partner_programs.utils import filter_program_projects_by_field_name
5051
from projects.models import Project
@@ -518,7 +519,9 @@ def get(self, request, pk: int):
518519
extra_field_keys_order=extra_keys_order,
519520
row_number=row_number,
520521
)
521-
ws.append([row_dict.get(key, "") for key, _ in header_pairs])
522+
raw_values = [row_dict.get(key, "") for key, _ in header_pairs]
523+
safe_values = [sanitize_excel_value(v) for v in raw_values]
524+
ws.append(safe_values)
522525

523526
bio = io.BytesIO()
524527
wb.save(bio)

0 commit comments

Comments
 (0)