diff --git a/src/c3nav/routing/api.py b/src/c3nav/routing/api.py index 70938318..bd1c8b0e 100644 --- a/src/c3nav/routing/api.py +++ b/src/c3nav/routing/api.py @@ -63,10 +63,15 @@ class RoutingViewSet(ViewSet): @list_route(methods=['get', 'post']) def options(self, request, *args, **kwargs): - params = request.POST if request.method == 'POST' else request.GET - - if request.method == 'POST' or 'save' in params: - pass - options = RouteOptions.get_for_request(request) + + if request.method == 'POST': + try: + options.update(request.POST, ignore_unknown=True) + except ValidationError as e: + return Response({ + 'errors': (str(e),), + }, status=400) + options.save() + return Response(options.serialize()) diff --git a/src/c3nav/routing/models.py b/src/c3nav/routing/models.py index b6b17a65..82833600 100644 --- a/src/c3nav/routing/models.py +++ b/src/c3nav/routing/models.py @@ -119,6 +119,8 @@ class RouteOptions(models.Model): def update(self, value_dict, ignore_errors=False, ignore_unknown=False): if not value_dict: return + if isinstance(value_dict, RouteOptions): + value_dict = value_dict.data fields = self.get_fields() for key, value in value_dict.items(): field = fields.get(key) @@ -156,6 +158,6 @@ class RouteOptions(models.Model): def save(self, *args, **kwargs): if self.request is None or self.request.user.is_authenticated: self.user = self.request.user - super().save(*args, **kwargs) + return super().save(*args, **kwargs) self.request.session['route_options'] = self diff --git a/src/c3nav/site/static/site/js/c3nav.js b/src/c3nav/site/static/site/js/c3nav.js index 404a9cc8..1c237dd6 100644 --- a/src/c3nav/site/static/site/js/c3nav.js +++ b/src/c3nav/site/static/site/js/c3nav.js @@ -84,7 +84,10 @@ c3nav = { $('#route-search-buttons, #route-result-buttons').find('.swap').on('click', c3nav._route_buttons_swap_click); $('#route-search-buttons').find('.close').on('click', c3nav._route_buttons_close_click); $('#route-summary').find('.options').on('click', c3nav._buttons_options_click); - $('#route-options').find('.close').on('click', c3nav._route_options_close_click); + + var $route_options = $('#route-options'); + $route_options.find('.close').on('click', c3nav._route_options_close_click); + $route_options.find('button').on('click', c3nav._route_options_submit); $('#map').on('click', '.location-popup .button-clear', c3nav._popup_button_click); $('#modal').on('click', c3nav._modal_click) @@ -243,20 +246,21 @@ c3nav = { } $location_details.removeClass('loading'); }, + next_route_options: null, load_route: function (origin, destination, nofly) { var $route = $('#route-summary'), $details_wrapper = $('#route-details'), $options_wrapper = $('#route-options'); - if ($route.attr('data-origin') !== String(origin.id) || $route.attr('data-destination') !== String(destination.id)) { + if (c3nav.next_route_options || $route.attr('data-origin') !== String(origin.id) || $route.attr('data-destination') !== String(destination.id)) { c3nav._clear_route_layers(); $route.addClass('loading').attr('data-origin', origin.id).attr('data-destination', destination.id); $details_wrapper.addClass('loading'); $options_wrapper.addClass('loading'); - $.post('/api/routing/route/', { + $.post('/api/routing/route/', $.extend({ 'origin': origin.id, 'destination': destination.id, 'csrfmiddlewaretoken': c3nav.get_csrf_token() - }, function(data) { + }, c3nav.next_route_options || {}), function(data) { c3nav._route_loaded(data, nofly) }, 'json').fail(function(data) { c3nav._route_loaded({ @@ -264,6 +268,7 @@ c3nav = { }) }); } + c3nav.next_route_options = null; }, _route_loaded: function(data, nofly) { var $route = $('#route-summary'); @@ -437,10 +442,10 @@ c3nav = { field_id = 'option_id_'+option.name; $options.append($('