From 55d2d6759f605c25ae0c379d9ecfe47b54212f53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 6 Jul 2017 13:07:05 +0200 Subject: [PATCH] create new ChangeSet API --- src/c3nav/api/urls.py | 3 +- src/c3nav/editor/api.py | 37 ++++++++++++++++++---- src/c3nav/editor/models/changedobject.py | 12 +++++++ src/c3nav/editor/models/changeset.py | 13 ++++++++ src/c3nav/editor/models/changesetupdate.py | 9 ++++++ 5 files changed, 67 insertions(+), 7 deletions(-) diff --git a/src/c3nav/api/urls.py b/src/c3nav/api/urls.py index c2ea39ab..410b67f1 100644 --- a/src/c3nav/api/urls.py +++ b/src/c3nav/api/urls.py @@ -7,7 +7,7 @@ from rest_framework.generics import GenericAPIView from rest_framework.response import Response from rest_framework.routers import SimpleRouter -from c3nav.editor.api import EditorViewSet +from c3nav.editor.api import ChangeSetViewSet, EditorViewSet from c3nav.mapdata.api import (AreaViewSet, BuildingViewSet, ColumnViewSet, DoorViewSet, HoleViewSet, LevelViewSet, LineObstacleViewSet, LocationGroupViewSet, LocationViewSet, ObstacleViewSet, PointViewSet, SourceViewSet, SpaceViewSet, StairViewSet) @@ -30,6 +30,7 @@ router.register(r'locations', LocationViewSet) router.register(r'locationgroups', LocationGroupViewSet) router.register(r'editor', EditorViewSet, base_name='editor') +router.register(r'changesets', ChangeSetViewSet) class APIRoot(GenericAPIView): diff --git a/src/c3nav/editor/api.py b/src/c3nav/editor/api.py index 60624a02..08c0e8b4 100644 --- a/src/c3nav/editor/api.py +++ b/src/c3nav/editor/api.py @@ -1,10 +1,10 @@ from itertools import chain -from rest_framework.decorators import list_route +from rest_framework.decorators import detail_route, list_route from rest_framework.exceptions import ValidationError from rest_framework.generics import get_object_or_404 from rest_framework.response import Response -from rest_framework.viewsets import ViewSet +from rest_framework.viewsets import ReadOnlyModelViewSet, ViewSet from shapely.ops import cascaded_union from c3nav.editor.models import ChangeSet @@ -158,8 +158,33 @@ class EditorViewSet(ViewSet): 'shadow': '#000000', }) - @list_route(methods=['get']) - def changeset(self, request, *args, **kwargs): - request.changeset = ChangeSet.get_for_request(request) - return Response(request.changeset.serialize()) +class ChangeSetViewSet(ReadOnlyModelViewSet): + """ + List change sets + /current/ returns the current changeset. + """ + queryset = ChangeSet.objects.all() + + def get_queryset(self): + return ChangeSet.qs_for_request(self.request) + + def list(self, request, *args, **kwargs): + return Response([obj.serialize() for obj in self.get_queryset().order_by('id')]) + + def retrieve(self, request, *args, **kwargs): + return Response(self.get_object().serialize()) + + @list_route(methods=['get']) + def current(self, request, *args, **kwargs): + changeset = ChangeSet.get_for_request(request) + return Response(changeset.serialize()) + + @detail_route(methods=['get']) + def changes(self, request, *args, **kwargs): + changeset = self.get_object() + changeset.fill_changes_cache(include_deleted_created=True) + return Response([ + obj.serialize() + for obj in chain(*(changed_objects.values() for changed_objects in changeset.changed_objects.values())) + ]) diff --git a/src/c3nav/editor/models/changedobject.py b/src/c3nav/editor/models/changedobject.py index 3d67ccf6..d8c5927d 100644 --- a/src/c3nav/editor/models/changedobject.py +++ b/src/c3nav/editor/models/changedobject.py @@ -1,4 +1,5 @@ import typing +from collections import OrderedDict from itertools import chain from django.contrib.contenttypes.models import ContentType @@ -284,3 +285,14 @@ class ChangedObject(models.Model): def __repr__(self): return '' % (str(self.pk), str(self.changeset_id)) + + def serialize(self): + return OrderedDict(( + ('type', self.model_class.__name__.lower()), + ('is_created', self.is_created), + ('is_deleted', self.deleted), + ('pk', self.obj_pk), + ('updated_fields', self.updated_fields), + ('m2m_added', self.m2m_added), + ('m2m_removed', self.m2m_removed), + )) diff --git a/src/c3nav/editor/models/changeset.py b/src/c3nav/editor/models/changeset.py index 06df1148..f06045f2 100644 --- a/src/c3nav/editor/models/changeset.py +++ b/src/c3nav/editor/models/changeset.py @@ -74,6 +74,8 @@ class ChangeSet(models.Model): """ if request.user.is_authenticated: return ChangeSet.objects.filter(author=request.user) + elif 'changeset' in request.session: + return ChangeSet.objects.filter(pk=request.session['changeset']) return ChangeSet.objects.none() @classmethod @@ -447,7 +449,18 @@ class ChangeSet(models.Model): return OrderedDict(( ('id', self.pk), ('author', self.author_id), + ('state', self.state), + ('assigned_to', self.assigned_to_id), + ('changed_objects_count', self.changed_objects_count), ('created', None if self.created is None else self.created.isoformat()), + ('last_change', None if self.last_change is None else self.last_change.datetime.isoformat()), + ('last_update', None if self.last_update is None else self.last_update.datetime.isoformat()), + ('last_state_update', (None if self.last_state_update is None else + self.last_state_update.datetime.isoformat())), + ('last_state_update_user', (None if self.last_state_update is None else + self.last_state_update.user_id)), + ('last_state_update_comment', (None if self.last_state_update is None else + self.last_state_update.comment)), )) def save(self, *args, **kwargs): diff --git a/src/c3nav/editor/models/changesetupdate.py b/src/c3nav/editor/models/changesetupdate.py index e34a6b1c..0201a875 100644 --- a/src/c3nav/editor/models/changesetupdate.py +++ b/src/c3nav/editor/models/changesetupdate.py @@ -1,3 +1,5 @@ +from collections import OrderedDict + from django.conf import settings from django.db import models from django.utils.translation import ugettext_lazy as _ @@ -25,3 +27,10 @@ class ChangeSetUpdate(models.Model): def __repr__(self): return '' % (str(self.pk), str(self.changeset_id)) + + def serialize_tiny(self): + return OrderedDict(( + ('datetime', self.datetime.isoformat()), + ('comment', self.comment), + ('user', self.user_id), + ))