team-3/src/c3nav/site/views.py
2016-12-19 01:31:20 +01:00

80 lines
2.4 KiB
Python

import os
from django.conf import settings
from django.http import Http404, HttpResponse
from django.shortcuts import get_object_or_404, render
from PIL import Image, ImageDraw
from c3nav.mapdata.models import Level
from c3nav.mapdata.models.locations import get_location
from c3nav.mapdata.render.compose import composer
from c3nav.mapdata.utils.misc import get_dimensions
from c3nav.routing.graph import Graph
from c3nav.routing.utils.draw import _line_coords
ctype_mapping = {
'yes': ('up', 'down'),
'up': ('up', ),
'down': ('down', ),
'no': ()
}
def get_ctypes(prefix, value):
return tuple((prefix+'_'+direction) for direction in ctype_mapping.get(value, ('up', 'dowm')))
def main(request, origin=None, destination=None):
if origin:
origin = get_location(request, origin)
if origin is None:
raise Http404
if destination:
destination = get_location(request, destination)
if destination is None:
raise Http404
route = None
if request.method == 'POST' and origin and destination:
graph = Graph.load()
allowed_ctypes = ('', )
allowed_ctypes += get_ctypes('stairs', request.POST.get('stairs'))
allowed_ctypes += get_ctypes('escalator', request.POST.get('escalators'))
allowed_ctypes += get_ctypes('elevator', request.POST.get('elevators'))
route = graph.get_route(origin, destination, allowed_ctypes)
print(route)
route = route.split()
print(route)
if False:
filename = os.path.join(settings.RENDER_ROOT, 'base-level-0.png')
im = Image.open(filename)
height = im.size[1]
draw = ImageDraw.Draw(im)
for connection in route.connections:
draw.line(_line_coords(connection.from_point, connection.to_point, height), fill=(255, 100, 100))
response = HttpResponse(content_type="image/png")
im.save(response, "PNG")
return response
width, height = get_dimensions()
return render(request, 'site/main.html', {
'origin': origin,
'destination': destination,
'route': route,
'width': width,
'height': height,
'svg_width': width*6,
'svg_height': height*6,
})
def level_image(request, level):
level = get_object_or_404(Level, name=level, intermediate=False)
return composer.get_level_image(request, level)