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.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):
|
||||||
|
|
|
@ -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()))
|
||||||
|
])
|
||||||
|
|
|
@ -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),
|
||||||
|
))
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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),
|
||||||
|
))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue