diff --git a/src/c3nav/site/templates/site/fragment_select.html b/src/c3nav/site/templates/site/fragment_select.html new file mode 100644 index 00000000..2ff5028c --- /dev/null +++ b/src/c3nav/site/templates/site/fragment_select.html @@ -0,0 +1,8 @@ +{% load i18n %} + + diff --git a/src/c3nav/site/templates/site/main.html b/src/c3nav/site/templates/site/main.html index 95dea3bb..65c9b33b 100644 --- a/src/c3nav/site/templates/site/main.html +++ b/src/c3nav/site/templates/site/main.html @@ -16,42 +16,27 @@
- + {% include 'site/fragment_select.html' with name='stairs' value=stairs %}
- + {% include 'site/fragment_select.html' with name='escalators' value=escalators %}
- + {% include 'site/fragment_select.html' with name='elevators' value=elevators %}
- +

{% for name, includable in includables %} {% endfor %} {% for name, excludable in excludables %} {% endfor %}

@@ -61,7 +46,7 @@
diff --git a/src/c3nav/site/views.py b/src/c3nav/site/views.py index 4db8fd7f..f642c29e 100644 --- a/src/c3nav/site/views.py +++ b/src/c3nav/site/views.py @@ -1,9 +1,8 @@ -import os +from datetime import timedelta -from django.conf import settings -from django.http import Http404, HttpResponse +from django.http import Http404 from django.shortcuts import get_object_or_404, render -from PIL import Image, ImageDraw +from django.utils import timezone from c3nav.mapdata.models import Level from c3nav.mapdata.models.locations import get_location @@ -11,7 +10,6 @@ from c3nav.mapdata.permissions import get_excludables_includables 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'), @@ -25,6 +23,13 @@ def get_ctypes(prefix, value): return tuple((prefix+'_'+direction) for direction in ctype_mapping.get(value, ('up', 'down'))) +def reverse_ctypes(ctypes, name): + if name+'_up' in ctypes: + return 'yes' if name + '_down' in ctypes else 'up' + else: + return 'down' if name + '_down' in ctypes else 'no' + + def main(request, origin=None, destination=None): if origin: origin = get_location(request, origin) @@ -36,52 +41,79 @@ def main(request, origin=None, destination=None): if destination is None: raise Http404 - excludables, includables = get_excludables_includables() + include = () + avoid = () + stairs = 'yes' + escalators = 'yes' + elevators = 'yes' - route = None - if request.method in ('GET', 'POST') and origin and destination: - graph = Graph.load() + save_settings = False + if 'c3nav_settings' in request.COOKIES: + cookie_value = request.COOKIES['c3nav_settings'] + print(cookie_value) - 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')) + if isinstance(cookie_value, dict): + stairs = cookie_value.get('stairs', stairs) + escalators = cookie_value.get('escalators', escalators) + elevators = cookie_value.get('elevators', elevators) + + if isinstance(cookie_value.get('include'), list): + include = cookie_value.get('include') + + if isinstance(cookie_value.get('avoid'), list): + avoid = cookie_value.get('avoid') + + save_settings = True + + if request.method in 'POST': + stairs = request.POST.get('stairs', stairs) + escalators = request.POST.get('escalators', escalators) + elevators = request.POST.get('elevators', elevators) include = request.POST.getlist('include') avoid = request.POST.getlist('avoid') - include = set(include) & set(includables) - avoid = set(avoid) & set(excludables) + allowed_ctypes = ('', ) + allowed_ctypes += get_ctypes('stairs', request.POST.get('stairs', stairs)) + allowed_ctypes += get_ctypes('escalator', request.POST.get('escalators', escalators)) + allowed_ctypes += get_ctypes('elevator', request.POST.get('elevators', elevators)) + stairs = reverse_ctypes(allowed_ctypes, 'stairs') + escalators = reverse_ctypes(allowed_ctypes, 'escalator') + elevators = reverse_ctypes(allowed_ctypes, 'elevator') + + excludables, includables = get_excludables_includables() + include = set(include) & set(includables) + avoid = set(avoid) & set(excludables) + + if request.method in 'POST': + save_settings = request.POST.get('save_settings', '') == '1' + + route = None + if request.method in 'POST' and origin and destination: public = ':public' not in avoid nonpublic = ':nonpublic' in include + graph = Graph.load() route = graph.get_route(origin, destination, allowed_ctypes, public=public, nonpublic=nonpublic, avoid=avoid-set(':public'), include=include-set(':nonpublic')) route = route.split() route.create_routeparts() - 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', { + response = render(request, 'site/main.html', { 'origin': origin, 'destination': destination, + 'stairs': stairs, + 'escalators': escalators, + 'elevators': elevators, 'excludables': excludables.items(), 'includables': includables.items(), + 'include': include, + 'avoid': avoid, + 'save_settings': save_settings, 'route': route, 'width': width, @@ -90,6 +122,18 @@ def main(request, origin=None, destination=None): 'svg_height': height*6, }) + if request.method in 'POST' and save_settings: + cookie_value = { + 'stairs': stairs, + 'escalators': escalators, + 'elevators': elevators, + 'include': tuple(include), + 'avoid': tuple(avoid), + } + response.set_cookie('c3nav_settings', cookie_value, expires=timezone.now() + timedelta(days=30)) + + return response + def level_image(request, level): level = get_object_or_404(Level, name=level, intermediate=False)