Order import: Catch CSV parsing errors during iteration (PRETIXEU-9AW)

This commit is contained in:
Raphael Michel
2023-11-09 14:25:50 +01:00
parent 22301f5429
commit 77ff0298f1

View File

@@ -32,6 +32,7 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License. # License for the specific language governing permissions and limitations under the License.
import csv
import logging import logging
from datetime import timedelta from datetime import timedelta
@@ -146,16 +147,24 @@ class ProcessView(EventPermissionRequiredMixin, AsyncAction, FormView):
else: else:
charset = None charset = None
try: try:
return parse_csv(self.file.file, 1024 * 1024, charset=charset) try:
except UnicodeDecodeError: c = parse_csv(self.file.file, 1024 * 1024, charset=charset)
messages.warning( if c is not None:
self.request, return list(c)
_( except UnicodeDecodeError:
"We could not identify the character encoding of the CSV file. " messages.warning(
"Some characters were replaced with a placeholder." self.request,
_(
"We could not identify the character encoding of the CSV file. "
"Some characters were replaced with a placeholder."
)
) )
) c = parse_csv(self.file.file, 1024 * 1024, "replace", charset=charset)
return parse_csv(self.file.file, 1024 * 1024, "replace", charset=charset) if c is not None:
return list(c)
except csv.Error:
logger.exception("Could not parse CSV file")
return None
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if 'async_id' in request.GET and settings.HAS_CELERY: if 'async_id' in request.GET and settings.HAS_CELERY:
@@ -193,5 +202,5 @@ class ProcessView(EventPermissionRequiredMixin, AsyncAction, FormView):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
ctx['file'] = self.file ctx['file'] = self.file
ctx['parsed'] = self.parsed ctx['parsed'] = self.parsed
ctx['sample_rows'] = list(self.parsed)[:3] ctx['sample_rows'] = self.parsed[:3]
return ctx return ctx