From d0325a27d55eb44244175fc1505b0cc3c5105628 Mon Sep 17 00:00:00 2001 From: sunnybansal Date: Wed, 1 Apr 2020 01:45:22 -0400 Subject: [PATCH] Export all events --- mercury/templates/events.html | 3 + mercury/urls.py | 5 +- mercury/views/events.py | 159 ++++++++++++++++++++++++++++++---- 3 files changed, 148 insertions(+), 19 deletions(-) diff --git a/mercury/templates/events.html b/mercury/templates/events.html index 11a6910b..86dc6c9c 100644 --- a/mercury/templates/events.html +++ b/mercury/templates/events.html @@ -22,6 +22,9 @@

Events

+

+ Export all to CSV + Export all to JSON diff --git a/mercury/urls.py b/mercury/urls.py index ccd80e6e..8aa79582 100644 --- a/mercury/urls.py +++ b/mercury/urls.py @@ -37,7 +37,10 @@ path("events/delete/", events.delete_event), path("events/update/", events.update_event), path("events/updatevenue/", events.update_venue), - path("events/export/", events.export_event), + path("events/export//csv", events.export_event), + path("events/export/all/csv", events.export_all_event), + path("events/export//json", events.export_event), + path("events/export/all/json", events.export_all_event), path("pitcrew/", pitcrew.PitCrewView.as_view(), name="pitcrew"), path("gfconfig/", gf_config.GFConfigView.as_view(), name="gfconfig"), path( diff --git a/mercury/views/events.py b/mercury/views/events.py index 9feb0ab2..6b87095f 100644 --- a/mercury/views/events.py +++ b/mercury/views/events.py @@ -1,6 +1,8 @@ import csv +import json import logging - +from io import BytesIO +from zipfile import ZipFile from django.http import HttpResponse from django.shortcuts import render from django.shortcuts import redirect @@ -47,15 +49,34 @@ def delete_event(request, event_uuid=None): return redirect("/events") -def export_event(request, event_uuid=None): - event_to_export = AGEvent.objects.get(uuid=event_uuid) - if event_to_export: +def export_all_event(request): + if request.path.__contains__("json"): + events = AGEvent.objects.all().order_by("uuid") + filenames = [] + for event in events: + measurement_data = AGMeasurement.objects.filter(event_uuid=event.uuid) + venue = AGVenue.objects.get(uuid=event.venue_uuid.uuid) + temp = create_event_json(event, venue, measurement_data) + json_object = json.dumps(temp) + filename = event.name.replace(" ", "").lower() + filenames.append(filename + ".json") + with open(filename + ".json", "w") as outfile: + outfile.write(json_object) + byte_data = BytesIO() + try: + event_zip = ZipFile(byte_data, "w") + for fn in filenames: + event_zip.write(fn) + finally: + event_zip.close() + + response = HttpResponse(byte_data.getvalue(), content_type="application/zip") + response["Content-Disposition"] = "attachment; filename=events.zip" + return response + else: response = HttpResponse(content_type="text/csv") - filename = event_to_export.name.replace(" ", "").lower() - response["Content-Disposition"] = 'attachment; filename="' + filename + '".csv' - measurement_data = AGMeasurement.objects.filter(event_uuid=event_uuid) - if len(measurement_data) == 0: - return redirect("/events") + response["Content-Disposition"] = "attachment; filename=all_events.csv" + events = AGEvent.objects.all().order_by("uuid") writer = csv.writer(response) writer.writerow( [ @@ -69,26 +90,128 @@ def export_event(request, event_uuid=None): "Sensor Value", ] ) - i = 0 - venue = AGVenue.objects.get(uuid=event_to_export.venue_uuid.uuid) - sensor = AGSensor.objects.get(id=measurement_data[0].sensor_id.id) - for measurement in measurement_data: + for event in events: + measurement_data = AGMeasurement.objects.filter(event_uuid=event.uuid) + if len(measurement_data) == 0: + measurement_data = [] + venue = AGVenue.objects.get(uuid=event.venue_uuid.uuid) + response = create_event_csv( + writer, response, event, venue, measurement_data + ) + return response + + +def create_event_csv(writer, response, event_object, venue_object, measurements_object): + i = 0 + if len(measurements_object) > 0: + sensor = AGSensor.objects.get(id=measurements_object[0].sensor_id.id) + for measurement in measurements_object: i += 1 if sensor.id != measurement.sensor_id: sensor = AGSensor.objects.get(id=measurement.sensor_id.id) writer.writerow( [ str(i), - event_to_export.name, - event_to_export.date, - event_to_export.description, - venue.name, + event_object.name, + event_object.date, + event_object.description, + venue_object.name, sensor.name, measurement.timestamp, measurement.value["reading"], ] ) - return response + else: + i += 1 + writer.writerow( + [ + str(i), + event_object.name, + event_object.date, + event_object.description, + venue_object.name, + "no data for event", + "no data for event", + "no data for event", + ] + ) + + return response + + +def create_event_json(event_object, venue_object, measurements_object): + event_info = { + "name": event_object.name, + "event date": str(event_object.date), + "event description": event_object.description, + } + if venue_object: + event_info["venue name"] = venue_object.name + event_info["venue description"] = venue_object.description + + measurement_info = [] + if measurements_object: + sensor = AGSensor.objects.get(id=measurements_object[0].sensor_id.id) + for measurement in measurements_object: + if sensor.id != measurement.sensor_id: + sensor = AGSensor.objects.get(id=measurement.sensor_id.id) + temp = { + "sensor name": sensor.name, + "timestamp": str(measurement.timestamp), + "reading": measurement.value["reading"], + } + measurement_info.append(temp) + + data = { + "event_info": event_info, + "measurement_info": measurement_info, + } + + return data + + +def export_event(request, event_uuid=None, file_format="CSV"): + event_to_export = AGEvent.objects.get(uuid=event_uuid) + if event_to_export: + response = HttpResponse(content_type="text/csv") + filename = event_to_export.name.replace(" ", "").lower() + response["Content-Disposition"] = 'attachment; filename="' + filename + '".csv' + measurement_data = AGMeasurement.objects.filter(event_uuid=event_uuid) + if len(measurement_data) == 0: + return redirect("/events") + writer = csv.writer(response) + writer.writerow( + [ + "S.No", + "Event Name", + "Event Date", + "Event Description", + "Venue Name", + "Sensor Name", + "Sensor Data TimeStamp", + "Sensor Value", + ] + ) + venue = AGVenue.objects.get(uuid=event_to_export.venue_uuid.uuid) + if request.path.__contains__("json"): + data = create_event_json(event_to_export, venue, measurement_data) + response = HttpResponse(str(data), content_type="application/json") + response["Content-Disposition"] = ( + 'attachment; filename="' + filename + '".json' + ) + return response + else: + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = ( + 'attachment; filename="' + filename + '".csv' + ) + if len(measurement_data) == 0: + return redirect("/events") + + response = create_event_csv( + response, event_to_export, venue, measurement_data + ) + return response else: return redirect("/events")