Added database exporter in settings panel. Downloads a .json file
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
from django.forms import model_to_dict
|
||||
|
||||
from coord.models import *
|
||||
|
||||
|
||||
def get_export_dict():
|
||||
suburbs = []
|
||||
schools = []
|
||||
companies = []
|
||||
travellers = []
|
||||
|
||||
for suburb in Suburb.objects.all():
|
||||
suburbs.append(model_to_dict(suburb))
|
||||
|
||||
for school in School.objects.all():
|
||||
school_dict = model_to_dict(school)
|
||||
school_dict['suburb'] = school.suburb.name
|
||||
schools.append(school_dict)
|
||||
|
||||
for company in Company.objects.all():
|
||||
company_dict = model_to_dict(company)
|
||||
company_dict['suburb'] = company.suburb.name
|
||||
buses = []
|
||||
for bus in Bus.objects.filter(company=company):
|
||||
bus_dict = model_to_dict(bus)
|
||||
bus_dict.pop('company')
|
||||
drivers = []
|
||||
shuttles = []
|
||||
bus_stops = []
|
||||
|
||||
for driver in Driver.objects.filter(bus=bus):
|
||||
driver_dict = model_to_dict(driver)
|
||||
driver_dict.pop('bus')
|
||||
drivers.append(driver_dict)
|
||||
|
||||
for shuttle in Shuttle.objects.filter(bus=bus):
|
||||
shuttle_dict = model_to_dict(shuttle)
|
||||
shuttle_dict.pop('bus')
|
||||
shuttles.append(shuttle_dict)
|
||||
|
||||
for busStop in BusStop.objects.filter(bus=bus):
|
||||
bus_stop_dict = model_to_dict(busStop)
|
||||
bus_stop_dict.pop('bus')
|
||||
bus_stop_dict['am_time'] = busStop.am_time.strftime("%H:%M:%S")
|
||||
bus_stop_dict['pm_time'] = busStop.pm_time.strftime("%H:%M:%S")
|
||||
bus_stops.append(bus_stop_dict)
|
||||
|
||||
bus_dict['drivers'] = drivers
|
||||
bus_dict['shuttles'] = shuttles
|
||||
bus_dict['bus_stops'] = bus_stops
|
||||
buses.append(bus_dict)
|
||||
company_dict['buses'] = buses
|
||||
companies.append(company_dict)
|
||||
|
||||
for traveller in Traveller.objects.all():
|
||||
traveller_dict = model_to_dict(traveller)
|
||||
traveller_dict['school'] = traveller.school.name
|
||||
if traveller.residential_suburb is not None:
|
||||
traveller_dict['residential_suburb'] = traveller.residential_suburb.name
|
||||
if traveller.postal_suburb is not None:
|
||||
traveller_dict['postal_suburb'] = traveller.postal_suburb.name
|
||||
if traveller.dob is not None:
|
||||
traveller_dict['dob'] = traveller.dob.strftime("%Y-%m-%d")
|
||||
traveller_dict.pop('travel_start_date')
|
||||
traveller_dict.pop('travel_end_date')
|
||||
routes = []
|
||||
for route in TravellerRoute.objects.filter(traveller=traveller):
|
||||
route_dict = model_to_dict(route)
|
||||
route_dict.pop('traveller')
|
||||
route_dict['name'] = route.busStop.__str__()
|
||||
if route.travel_start_date is not None:
|
||||
route_dict['travel_start_date'] = route.travel_start_date.strftime("%Y-%m-%d")
|
||||
if route.travel_end_date is not None:
|
||||
route_dict['travel_end_date'] = route.travel_end_date.strftime("%Y-%m-%d")
|
||||
routes.append(route_dict)
|
||||
traveller_dict['bus_stops'] = routes
|
||||
travellers.append(traveller_dict)
|
||||
|
||||
return {'suburbs': suburbs, 'schools': schools, 'companies': companies, 'travellers': travellers}
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
{% block content %}
|
||||
<div><a href={% url 'settings:nightly_task' %}>Run nightly task</a></div>
|
||||
<div><a href={% url 'settings:export' %}>Export</a></div>
|
||||
<div>
|
||||
<div class="flex-container">
|
||||
<label for="id_traveller_term_cost">
|
||||
|
||||
@@ -6,5 +6,6 @@ app_name = "settings"
|
||||
urlpatterns = [
|
||||
path('rollover', views_settings.rollover, name='rollover'),
|
||||
path('nightly_task', views_settings.nightly_task, name='nightly_task'),
|
||||
path('export', views_settings.export, name='export'),
|
||||
path('', views_settings.settings, name='index'),
|
||||
]
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
import datetime
|
||||
import json
|
||||
|
||||
from django.contrib.admin.views.decorators import staff_member_required
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import render, redirect
|
||||
|
||||
from coord.scheduled_tasks import nightly_check_active_status
|
||||
from coord.utils.rollover import RolloverForm, execute_rollover
|
||||
|
||||
from coord.backup.backup_helpers import get_export_dict
|
||||
|
||||
|
||||
@staff_member_required
|
||||
def settings(request):
|
||||
@@ -21,7 +27,16 @@ def rollover(request):
|
||||
form = RolloverForm()
|
||||
return render(request, 'admin/rollover_form.html', context={'form': form})
|
||||
|
||||
|
||||
@staff_member_required
|
||||
def nightly_task(request):
|
||||
nightly_check_active_status()
|
||||
return redirect('settings:index')
|
||||
|
||||
|
||||
@staff_member_required
|
||||
def export(request):
|
||||
date = datetime.date.today().strftime("%Y-%m-%d")
|
||||
response = HttpResponse(json.dumps(get_export_dict()))
|
||||
response['Content-Disposition'] = f'attachment; filename=busportal_export-{date}.json'
|
||||
return response
|
||||
|
||||
Reference in New Issue
Block a user