create new ChangeSet API

This commit is contained in:
Laura Klünder 2017-07-06 13:07:05 +02:00
parent 7921f255e2
commit 55d2d6759f
5 changed files with 67 additions and 7 deletions

View file

@ -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):

View file

@ -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()))
])

View file

@ -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 '<ChangedObject #%s on ChangeSet #%s>' % (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),
))

View file

@ -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):

View file

@ -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 '<Update #%s on ChangeSet #%s>' % (str(self.pk), str(self.changeset_id))
def serialize_tiny(self):
return OrderedDict((
('datetime', self.datetime.isoformat()),
('comment', self.comment),
('user', self.user_id),
))