Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Export all events #312

Merged
merged 2 commits into from Apr 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions mercury/templates/events.html
Expand Up @@ -22,6 +22,9 @@ <h1>Events</h1>
<input class="grafana-btn grafana-btn-green" type="submit" onclick="toggleEventButton('create_venue');" value="Create Venue">
<input class="grafana-btn grafana-btn-green" type="submit" onclick="toggleEventButton('update_event');" value="Update Existing Event">
<input class="grafana-btn grafana-btn-green" type="submit" onclick="toggleEventButton('update_venue');" value="Update Existing Venue">
<br><br>
<a class="grafana-btn grafana-btn-green" href="export/all/csv">Export all to CSV</a>
<a class="grafana-btn grafana-btn-green" href="export/all/json">Export all to JSON</a>
</div>

<!-- All Venues -->
Expand Down
2 changes: 2 additions & 0 deletions mercury/urls.py
Expand Up @@ -38,7 +38,9 @@
path("events/update/<uuid:event_uuid>", events.update_event),
path("events/updatevenue/<uuid:venue_uuid>", events.update_venue),
path("events/export/<uuid:event_uuid>/csv", events.export_event),
path("events/export/all/csv", events.export_all_event),
path("events/export/<uuid:event_uuid>/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(
Expand Down
203 changes: 145 additions & 58 deletions mercury/views/events.py
@@ -1,6 +1,8 @@
import csv
import json
import logging

from io import BytesIO
from zipfile import ZipFile
from django.contrib import messages
from django.http import HttpResponse
from django.shortcuts import redirect
Expand Down Expand Up @@ -48,40 +50,152 @@ def delete_event(request, event_uuid=None):
return redirect("/events")


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")
response["Content-Disposition"] = "attachment; filename=all_events.csv"
events = AGEvent.objects.all().order_by("uuid")
writer = csv.writer(response)
writer.writerow(
[
"S.No",
"Event Name",
"Event Date",
"Event Description",
"Venue Name",
"Sensor Name",
"Sensor Data TimeStamp",
"Sensor Value",
]
)
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_object.name,
event_object.date,
event_object.description,
venue_object.name,
sensor.name,
measurement.timestamp,
measurement.value["reading"],
]
)
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"):
event_info = {
"name": event_to_export.name,
"event date": str(event_to_export.date),
"event description": event_to_export.description,
}
if venue:
event_info["venue name"] = venue.name
event_info["venue description"] = venue.description

measurement_info = []
if measurement_data:
sensor = AGSensor.objects.get(id=measurement_data[0].sensor_id.id)
for measurement in measurement_data:
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,
}

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'
Expand All @@ -94,37 +208,10 @@ def export_event(request, event_uuid=None, file_format="CSV"):
)
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",
]

response = create_event_csv(
response, event_to_export, venue, measurement_data
)
i = 0
sensor = AGSensor.objects.get(id=measurement_data[0].sensor_id.id)
for measurement in measurement_data:
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,
sensor.name,
measurement.timestamp,
measurement.value["reading"],
]
)
return response
else:
return redirect("/events")
Expand Down