Skip to content

Commit ba428dc

Browse files
committed
Fix decoding utf-8/windows files
1 parent 6620931 commit ba428dc

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

backend/donations/views/download_donations/byof.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from xml.etree.ElementTree import Element, ElementTree
66

77
from django.core.files.base import ContentFile
8-
from django.core.files.uploadedfile import InMemoryUploadedFile
98
from django.utils import timezone
109

1110
from donations.models.byof import OwnFormsUpload, OwnFormsStatusChoices
@@ -138,13 +137,35 @@ def generate_xml_from_external_data(own_upload: OwnFormsUpload) -> Dict[str, Uni
138137
return {"error": None, "data": xml_element_tree}
139138

140139

141-
def parse_file_data(file: InMemoryUploadedFile) -> List[DonorModel]:
140+
def decode_readfile(input_file):
141+
# TODO: Try to optimize/simplify this
142+
readfile = input_file.read()
143+
144+
try:
145+
# Try to decode the file as utf-8
146+
# Deepcopy the readfile to avoid modifying the original bytes
147+
read_file = readfile.decode("utf-8")
148+
except UnicodeDecodeError:
149+
# If utf-8 fails, try cp1252 — common for Windows
150+
try:
151+
input_file.seek(0)
152+
readfile = input_file.read()
153+
read_file = readfile.decode("cp1252")
154+
except UnicodeDecodeError:
155+
raise ValueError(_("The file is not in a valid format."))
156+
157+
return read_file
158+
159+
160+
def parse_file_data(file) -> List[DonorModel]:
142161
"""
143162
Transform the CSV file to raw data.
144163
:param file: The CSV file path
145164
:return: A list of dictionaries containing the information of donors
146165
"""
147-
read_file = file.read().decode("utf-8")
166+
167+
read_file = decode_readfile(file)
168+
148169
reader = csv.DictReader(io.StringIO(read_file))
149170

150171
header_check = _check_csv_header(reader)

backend/donations/views/ngo_account/byof.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
from django.urls import reverse, reverse_lazy
77
from django.utils.decorators import method_decorator
88
from django.utils.translation import gettext_lazy as _
9-
from django_q.tasks import async_task
109

1110
from donations.forms.ngo_account import BringYourOwnDataForm
1211
from donations.models.ngos import Ngo
1312
from donations.models.byof import OwnFormsUpload
1413
from donations.views.download_donations.byof import handle_external_data_processing
1514
from donations.views.ngo_account.common import FileDownloadProxy, NgoBaseListView
15+
from redirectioneaza.common.async_wrapper import async_wrapper
1616
from users.models import User
1717

1818

@@ -70,7 +70,7 @@ def post(self, request: HttpRequest, *args, **kwargs):
7070
own_upload.ngo = ngo
7171
own_upload.save()
7272

73-
async_task(handle_external_data_processing, own_upload.pk)
73+
async_wrapper(handle_external_data_processing, own_upload.pk)
7474

7575
messages.success(request, _("The uploaded data file will be processed soon."))
7676

0 commit comments

Comments
 (0)