Source code for utils.views.general

import csv
from time import sleep

import dateutil.utils
import requests
from dateutil.relativedelta import relativedelta
from django.contrib.auth.decorators import login_required
from django.db.models import Count
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from django.utils import timezone
from geopy import Nominatim

from api.models import ApiLog
from rbac.decorators import rbac_check_role
from utils.utils import cobalt_paginator


[docs] @login_required() def geo_location(request, location): """return lat and long for a text address""" try: geolocator = Nominatim(user_agent="cobalt") loc = geolocator.geocode(location) html = {"lat": loc.latitude, "lon": loc.longitude} data_dict = {"data": html} return JsonResponse(data=data_dict, safe=False) except: # noqa E722 return JsonResponse({"data": {"lat": None, "lon": None}}, safe=False)
[docs] def download_csv(self, request, queryset): """Copied from Stack Overflow - generic CSV download""" model = queryset.model model_fields = model._meta.fields + model._meta.many_to_many field_names = [field.name for field in model_fields] response = HttpResponse(content_type="text/csv") response["Content-Disposition"] = 'attachment; filename="export.csv"' # the csv writer writer = csv.writer(response) # Write a first row with header information writer.writerow(field_names) # Write data rows for row in queryset: values = [] for field in field_names: value = getattr(row, field) values.append(value) writer.writerow(values) return response
[docs] def masterpoint_query(query): """Generic function to talk to the masterpoints server and return data Takes in a SQLServer query e.g. "select count(*) from table" Returns an iterable, either an empty list or the response from the server. In case there is a problem connecting to the server, this will do everything it can to fail silently. """ # Try to load data from MP Server try: response = requests.get(query, timeout=10).json() except Exception as exc: print(exc) response = [] return response
@rbac_check_role("system.admin.edit") def api_log_viewer(request): """Allow admins to see calls to the API""" # Get all records api_logs = ApiLog.objects.order_by("-pk") things = cobalt_paginator(request, api_logs) # Get summary three_months_ago = timezone.now() - relativedelta(months=3) summary = ( ApiLog.objects.filter(created_date__gte=three_months_ago) .values("api", "version") .annotate(total=Count("api")) .order_by("-total") ) print(summary) return render( request, "utils/api_log_viewer.html", {"things": things, "summary": summary} )
[docs] def timeout(request): """simulate a timeout for testing purposes""" sleep(100) return HttpResponse("time out test")