Skip to content
This repository has been archived by the owner on Aug 10, 2024. It is now read-only.

Commit

Permalink
Add detailed error messages to views
Browse files Browse the repository at this point in the history
  • Loading branch information
aaron-lane committed Dec 29, 2023
1 parent f0cf861 commit 5d267e9
Showing 1 changed file with 43 additions and 28 deletions.
71 changes: 43 additions & 28 deletions app/views/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,58 +36,67 @@ def get_analytics(request: HttpRequest):
return render(request, "app/analytics.html", _context("Analytics"))


def import_view_template(request, importer, filetype, required_permission):
"""A importer view template
@require_http_methods(["GET", "POST"])
@login_required(login_url="/login")
def import_csv(request: HttpRequest):
"""A view to redirect after task queuing csv importer
"""
if not request.user.has_perm(required_permission):
return _error(request, PERMISSION_DENIED)
filetype = ".csv"

if not request.user.has_perm("app.can_import_historical"):
return _error(request=request, err_msg=PERMISSION_DENIED)

res = HttpResponseRedirect("/")

if request.method == "GET":
if "job" in request.GET:
res = _poll_state_response(request, "import_csv")
elif request.method == "POST":
else:
res = _error(
request=request,
err_msg="The job query parameter of the request was omitted.")
# POST is the only other valid method
else:
uploaded_file = request.FILES.get("uploaded_file", None)
if uploaded_file and uploaded_file.name.endswith(filetype):
raw_file = uploaded_file.read()
decoded_file = str(raw_file, 'utf-8-sig',
errors='ignore').splitlines()
job = importer.s(decoded_file).delay()
job = historical_data_importer.s(decoded_file).delay()
res = HttpResponseRedirect(f"{reverse('import_csv')}?job={job.id}")
else:
res = _error(request)
return res
res = _error(
request=request,
err_msg="Uploaded file {uploaded_file.name} is not a {filetype} file.")


@require_http_methods(["GET", "POST"])
@login_required(login_url="/login")
def import_csv(request: HttpRequest):
"""A view to redirect after task queuing csv importer
"""
return import_view_template(
request, historical_data_importer, ".csv", "app.can_import_historical")
return res


@require_http_methods(["GET", "POST"])
@login_required(login_url="/login")
def export_csv(request: HttpRequest):
"""Queue CSV exporter then redirect to poll state"""
if not request.user.has_perm('app.can_export_data'):
return _error(request, PERMISSION_DENIED)
return _error(request=request, err_msg=PERMISSION_DENIED)

res = HttpResponseRedirect("/")

if request.method == "GET":
if "job" in request.GET:
return _poll_state_response(request, "export_csv")
elif request.method == "POST":
res = _poll_state_response(request, "export_csv")
else:
res = _error(
request=request,
err_msg="The job query parameter of the request was omitted.")
# POST is the only other valid method
else:
export_name = request.POST.get("export_name", "export")
queryset = request.queryset if hasattr(request, 'queryset') \
else Item.objects.all()
rows = serializers.serialize("json", queryset)
job = exporter.s(export_name, rows, len(queryset)).delay()
res = HttpResponseRedirect(f"{reverse('export_csv')}?job={job.id}")

return res


Expand All @@ -98,14 +107,17 @@ def download_receipt(request: HttpRequest):
Takes request from admin which contains request.queryset
"""
if not request.user.has_perm('app.generate_tax_receipt'):
return _error(request, PERMISSION_DENIED)

res = _error(request)
return _error(request=request, err_msg=PERMISSION_DENIED)

if request.method == "GET":
if "job" in request.GET:
res = _poll_state_response(request, "download_receipt")
elif request.method == "POST":
else:
res = _error(
request=request,
err_msg="The job query parameter of the request was omitted.")
# POST is the only other valid method
else:
queryset = serializers.serialize("json", request.queryset)
job = receiptor.s(queryset, len(request.queryset)).delay()
res = HttpResponseRedirect(
Expand All @@ -119,7 +131,9 @@ def poll_state(request: HttpRequest):
"""A view to report the progress to the user"""
task_id = request.POST.get("task_id", None)
if task_id is None:
return _error(request)
return _error(
request=request,
err_msg="The task_id query parameter of the request was omitted.")

task = AsyncResult(task_id)
res = JsonResponse(_poll_state(PENDING, 0, 200))
Expand Down Expand Up @@ -153,10 +167,12 @@ def download_file(request: HttpRequest):
except TimeoutError:
print(f"{task} {task_name} failed #{attempts}")
if (attempts >= ATTEMPT_LIMIT):
return _error(request, "Download exceeded max attempts")
return _error(
request=request,
err_msg="Download exceeded max attempts")
return result
except Exception as e:
return _error(request, "Something went wrong.", e)
return _error(request=request, err_msg=f"Failed to download file: {e}")


def error(request):
Expand Down Expand Up @@ -186,8 +202,7 @@ def _context(title, override={}):
return context


def _error(request: HttpRequest, err_msg="Something went wrong.", e=None):
# logger.exception(e)
def _error(request: HttpRequest, err_msg="Something went wrong."):
return render(request, "app/error.html", _context(err_msg))


Expand Down

0 comments on commit 5d267e9

Please sign in to comment.