create new ChangeSet API
This commit is contained in:
parent
7921f255e2
commit
55d2d6759f
5 changed files with 67 additions and 7 deletions
|
@ -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):
|
||||
|
|
|
@ -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()))
|
||||
])
|
||||
|
|
|
@ -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),
|
||||
))
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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),
|
||||
))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue