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.response import Response
from rest_framework.routers import SimpleRouter 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, from c3nav.mapdata.api import (AreaViewSet, BuildingViewSet, ColumnViewSet, DoorViewSet, HoleViewSet, LevelViewSet,
LineObstacleViewSet, LocationGroupViewSet, LocationViewSet, ObstacleViewSet, LineObstacleViewSet, LocationGroupViewSet, LocationViewSet, ObstacleViewSet,
PointViewSet, SourceViewSet, SpaceViewSet, StairViewSet) PointViewSet, SourceViewSet, SpaceViewSet, StairViewSet)
@ -30,6 +30,7 @@ router.register(r'locations', LocationViewSet)
router.register(r'locationgroups', LocationGroupViewSet) router.register(r'locationgroups', LocationGroupViewSet)
router.register(r'editor', EditorViewSet, base_name='editor') router.register(r'editor', EditorViewSet, base_name='editor')
router.register(r'changesets', ChangeSetViewSet)
class APIRoot(GenericAPIView): class APIRoot(GenericAPIView):

View file

@ -1,10 +1,10 @@
from itertools import chain 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.exceptions import ValidationError
from rest_framework.generics import get_object_or_404 from rest_framework.generics import get_object_or_404
from rest_framework.response import Response 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 shapely.ops import cascaded_union
from c3nav.editor.models import ChangeSet from c3nav.editor.models import ChangeSet
@ -158,8 +158,33 @@ class EditorViewSet(ViewSet):
'shadow': '#000000', '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 import typing
from collections import OrderedDict
from itertools import chain from itertools import chain
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
@ -284,3 +285,14 @@ class ChangedObject(models.Model):
def __repr__(self): def __repr__(self):
return '<ChangedObject #%s on ChangeSet #%s>' % (str(self.pk), str(self.changeset_id)) 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: if request.user.is_authenticated:
return ChangeSet.objects.filter(author=request.user) return ChangeSet.objects.filter(author=request.user)
elif 'changeset' in request.session:
return ChangeSet.objects.filter(pk=request.session['changeset'])
return ChangeSet.objects.none() return ChangeSet.objects.none()
@classmethod @classmethod
@ -447,7 +449,18 @@ class ChangeSet(models.Model):
return OrderedDict(( return OrderedDict((
('id', self.pk), ('id', self.pk),
('author', self.author_id), ('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()), ('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): def save(self, *args, **kwargs):

View file

@ -1,3 +1,5 @@
from collections import OrderedDict
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -25,3 +27,10 @@ class ChangeSetUpdate(models.Model):
def __repr__(self): def __repr__(self):
return '<Update #%s on ChangeSet #%s>' % (str(self.pk), str(self.changeset_id)) 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),
))