From 1d6ce7179db0bb7bb027914e52c9dbef39b546c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Fri, 16 Jun 2017 20:27:07 +0200 Subject: [PATCH] add simple api to view the current changeset --- src/c3nav/editor/api.py | 7 +++++++ src/c3nav/editor/models.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/c3nav/editor/api.py b/src/c3nav/editor/api.py index 3d48766d..a4a3739f 100644 --- a/src/c3nav/editor/api.py +++ b/src/c3nav/editor/api.py @@ -15,6 +15,7 @@ class EditorViewSet(ViewSet): Editor API /geometries/ returns a list of geojson features, you have to specify ?level= or ?space= /geometrystyles/ returns styling information for all geometry types + /changeset/ returns the current changeset """ def _get_level_geometries(self, level): buildings = level.buildings.all() @@ -153,3 +154,9 @@ class EditorViewSet(ViewSet): 'point': '#4488cc', 'shadow': '#000000', }) + + @list_route(methods=['get']) + def changeset(self, request, *args, **kwargs): + request.changeset = ChangeSet.get_for_request(request) + + return Response(request.changeset.serialize()) diff --git a/src/c3nav/editor/models.py b/src/c3nav/editor/models.py index 0bb18184..a457c1a5 100644 --- a/src/c3nav/editor/models.py +++ b/src/c3nav/editor/models.py @@ -1,5 +1,6 @@ import json import typing +from collections import OrderedDict from django.apps import apps from django.conf import settings @@ -246,6 +247,17 @@ class ChangeSet(models.Model): def add_delete(self, obj, author=None): return self._new_change(author=author, action='delete', obj=obj) + def serialize(self): + return OrderedDict(( + ('id', self.pk), + ('author', self.author_id), + ('created', None if self.created is None else self.created.isoformat()), + ('proposed', None if self.proposed is None else self.proposed.isoformat()), + ('applied', None if self.applied is None else self.applied.isoformat()), + ('applied_by', None if self.applied_by_id is None else self.applied_by_id), + ('changes', tuple(change.serialize() for change in self.changes.all())), + )) + class Change(models.Model): ACTIONS = ( @@ -407,3 +419,19 @@ class Change(models.Model): result += 'Update (m2m) object '+repr(self.obj)+': '+self.field_name+'.remove('+self.field_value+')' result += '>' return result + + def serialize(self): + result = OrderedDict(( + ('id', self.pk), + ('author', self.author_id), + ('created', None if self.created is None else self.created.isoformat()), + ('action', self.action), + ('object_type', self.model_class.__name__.lower()), + ('object_id', ('c'+str(self.pk)) if self.action == 'create' else self.obj_pk), + )) + if self.action in ('update', 'm2m_add', 'm2m_remove'): + result.update(OrderedDict(( + ('name', self.field_name), + ('value', json.loads(self.field_value)), + ))) + return result