django-orchestra/orchestra/api/options.py

98 lines
4 KiB
Python
Raw Normal View History

2015-04-05 18:02:36 +00:00
from django.contrib.admin.options import get_content_type_for_model
2015-02-24 09:34:26 +00:00
from django.conf import settings as django_settings
2015-04-05 18:02:36 +00:00
from django.utils.encoding import force_text
2014-10-07 13:08:59 +00:00
from django.utils.module_loading import autodiscover_modules
2015-04-05 18:02:36 +00:00
from django.utils.translation import ugettext as _
2015-04-04 18:10:39 +00:00
from rest_framework.routers import DefaultRouter
2014-05-08 16:59:35 +00:00
2014-05-13 13:46:40 +00:00
from orchestra import settings
from orchestra.utils.python import import_class
2015-04-04 17:44:07 +00:00
from .helpers import insert_links
2014-05-08 16:59:35 +00:00
2015-04-05 18:02:36 +00:00
class LogApiMixin(object):
2015-04-23 14:34:04 +00:00
def create(self, request, *args, **kwargs):
2015-04-05 18:02:36 +00:00
from django.contrib.admin.models import ADDITION
2015-04-23 14:34:04 +00:00
response = super(LogApiMixin, self).create(request, *args, **kwargs)
2015-04-05 18:02:36 +00:00
message = _('Added.')
2015-04-23 14:34:04 +00:00
self.log(request, message, ADDITION, instance=self.serializer.instance)
2015-04-05 18:02:36 +00:00
return response
2015-04-23 14:34:04 +00:00
def perform_create(self, serializer):
""" stores serializer for accessing instance on create() """
super(LogApiMixin, self).perform_create(serializer)
self.serializer = serializer
def update(self, request, *args, **kwargs):
2015-04-05 18:02:36 +00:00
from django.contrib.admin.models import CHANGE
2015-04-23 14:34:04 +00:00
response = super(LogApiMixin, self).update(request, *args, **kwargs)
message = _('Changed data')
2015-04-05 18:02:36 +00:00
self.log(request, message, CHANGE)
return response
2015-04-23 14:34:04 +00:00
def partial_update(self, request, *args, **kwargs):
2015-04-05 18:02:36 +00:00
from django.contrib.admin.models import CHANGE
2015-04-23 14:34:04 +00:00
response = super(LogApiMixin, self).partial_update(request, *args, **kwargs)
2015-04-05 18:02:36 +00:00
message = _('Changed %s') % str(response.data)
self.log(request, message, CHANGE)
return response
2015-04-23 14:34:04 +00:00
def destroy(self, request, *args, **kwargs):
2015-04-05 18:02:36 +00:00
from django.contrib.admin.models import DELETION
message = _('Deleted')
self.log(request, message, DELETION)
2015-04-23 14:34:04 +00:00
response = super(LogApiMixin, self).destroy(request, *args, **kwargs)
2015-04-05 18:02:36 +00:00
return response
2015-04-23 14:34:04 +00:00
def log(self, request, message, action, instance=None):
2015-04-05 18:02:36 +00:00
from django.contrib.admin.models import LogEntry
2015-04-23 14:34:04 +00:00
instance = instance or self.get_object()
2015-04-05 18:02:36 +00:00
LogEntry.objects.log_action(
user_id=request.user.pk,
content_type_id=get_content_type_for_model(instance).pk,
object_id=instance.pk,
object_repr=force_text(instance),
action_flag=action,
change_message=message,
)
2014-05-08 16:59:35 +00:00
class LinkHeaderRouter(DefaultRouter):
def get_api_root_view(self):
""" returns the root view, with all the linked collections """
APIRoot = import_class(settings.ORCHESTRA_API_ROOT_VIEW)
2014-05-13 13:46:40 +00:00
APIRoot.router = self
2014-05-08 16:59:35 +00:00
return APIRoot.as_view()
def register(self, prefix, viewset, base_name=None):
""" inserts link headers on every viewset """
if base_name is None:
base_name = self.get_default_base_name(viewset)
insert_links(viewset, base_name)
self.registry.append((prefix, viewset, base_name))
2014-07-10 17:34:23 +00:00
def get_viewset(self, prefix_or_model):
for _prefix, viewset, __ in self.registry:
2015-04-23 14:34:04 +00:00
if _prefix == prefix_or_model or viewset.queryset.model == prefix_or_model:
2014-07-10 17:34:23 +00:00
return viewset
2014-07-21 15:43:36 +00:00
msg = "%s does not have a regiestered viewset" % prefix_or_model
raise KeyError(msg)
2014-07-10 17:34:23 +00:00
2014-07-08 16:37:38 +00:00
def insert(self, prefix_or_model, name, field, **kwargs):
2014-05-08 16:59:35 +00:00
""" Dynamically add new fields to an existing serializer """
2014-07-10 17:34:23 +00:00
viewset = self.get_viewset(prefix_or_model)
2014-10-07 13:08:59 +00:00
# setattr(viewset, 'inserted', getattr(viewset, 'inserted', []))
2014-07-10 17:34:23 +00:00
if viewset.serializer_class is None:
viewset.serializer_class = viewset().get_serializer_class()
2015-04-23 14:34:04 +00:00
viewset.serializer_class._declared_fields.update({name: field(**kwargs)})
2014-10-07 13:08:59 +00:00
# if not name in viewset.inserted:
viewset.serializer_class.Meta.fields += (name,)
# viewset.inserted.append(name)
2014-05-08 16:59:35 +00:00
# Create a router and register our viewsets with it.
2015-02-24 09:34:26 +00:00
router = LinkHeaderRouter(trailing_slash=django_settings.APPEND_SLASH)
2014-05-08 16:59:35 +00:00
2014-10-07 13:08:59 +00:00
autodiscover = lambda: (autodiscover_modules('api'), autodiscover_modules('serializers'))