Ejemplo n.º 1
0
    def _get_dataset(self, request, response, instance, dataset):
        """Return one page of the array data.
        """
        root = get_slumber_root()
        response['instance'] = root + self.model.path + '%s/%s/%s/' % (
            self.name, str(instance.pk), dataset)

        try:
            query = getattr(instance, dataset + '_set')
        except AttributeError:
            query = getattr(instance, dataset)
        query = query.order_by('-pk')
        if request.GET.has_key('start_after'):
            query = query.filter(pk__lt=request.GET['start_after'])

        response['page'] = []
        for obj in query[:10]:
            model = DJANGO_MODEL_TO_SLUMBER_MODEL[type(obj)]
            response['page'].append(dict(
                    type=root + model.path,
                    pk=obj.pk, display=unicode(obj),
                    data=root + model.path + 'data/%s/' % obj.pk))

        if query.count() > len(response['page']):
            response['next_page'] = root + self.model.path + \
                '%s/%s/%s/?start_after=%s' % (
                    self.name, instance.pk, dataset,
                    response['page'][-1]['pk'])
Ejemplo n.º 2
0
 def fields(self):
     """Return the non-array fields.
     """
     self._get_fields_and_data_arrays()
     fields = {}
     for field, definition in self._fields.items():
         field_type = type(definition)
         if field_type == ForeignKey:
             fields[field] = dict(
                 name=field,
                 kind='object',
                 type=get_slumber_root() +
                 DJANGO_MODEL_TO_SLUMBER_MODEL[definition.rel.to].path,
                 verbose_name=definition.verbose_name)
         else:
             type_name = field_type.__module__ + '.' + \
                 field_type.__name__
             fields[field] = dict(name=field,
                                  kind='value',
                                  type=type_name,
                                  verbose_name=definition.verbose_name)
     for prop in self.properties['r']:
         fields[prop] = dict(name=prop,
                             kind='property',
                             type='.'.join([self.app.name, self.name,
                                            prop]),
                             readonly=True)
     return fields
Ejemplo n.º 3
0
def get_models(_, response, appname):
    """Return the models that comprise an application.
    """
    root = get_slumber_root()
    app = get_application(appname)
    response['models'] = dict([(n, root + m.path)
        for n, m in app.models.items()])
Ejemplo n.º 4
0
    def _get_dataset(self, request, response, instance, dataset):
        """Return one page of the array data.
        """
        root = get_slumber_root()
        response['instance'] = self(instance, dataset)

        try:
            query = getattr(instance, dataset + '_set')
        except AttributeError:
            query = getattr(instance, dataset)
        query = query.order_by('-pk')
        if request.GET.has_key('start_after'):
            query = query.filter(pk__lt=request.GET['start_after'])

        response['page'] = []
        for obj in query[:10]:
            model = type(obj).slumber_model
            response['page'].append(dict(
                    type=root + model.path,
                    pk=obj.pk, display=unicode(obj),
                    data=model.operations['data'](obj)))

        if query.count() > len(response['page']):
            response['next_page'] = self(instance, dataset,
                start_after=response['page'][-1]['pk'])
Ejemplo n.º 5
0
 def fields(self):
     """Return the non-array fields.
     """
     self._get_fields_and_data_arrays()
     fields = {}
     for field, definition in self._fields.items():
         field_type = type(definition)
         if field_type == ForeignKey:
             fields[field] = dict(
                 name=field,
                 kind='object',
                 type=get_slumber_root() +
                     DJANGO_MODEL_TO_SLUMBER_MODEL[definition.rel.to].path,
                 verbose_name=getattr(definition, 'verbose_name', field))
         else:
             type_name = field_type.__module__ + '.' + \
                 field_type.__name__
             fields[field] = dict(name=field,
                 kind='value', type=type_name,
                 verbose_name=getattr(definition, 'verbose_name', field))
     for prop in self.properties['r']:
         fields[prop] = dict(
             name=prop,
             kind='property',
             type='.'.join([self.app.name, self.name, prop]),
             readonly=True)
     return fields
Ejemplo n.º 6
0
 def instance_url(self):
     from slumber.server import get_slumber_root
     from slumber._caches import DATABASE_TABLE_TO_SLUMBER_MODEL
     slumber_model = DATABASE_TABLE_TO_SLUMBER_MODEL[self.table]
     pk_name = slumber_model.model._meta.pk.name
     pk = self.new[pk_name] if self.new else self.old[pk_name]
     return get_slumber_root() + slumber_model.path + 'data/{}/'.format(pk)
Ejemplo n.º 7
0
    def _get_dataset(self, request, response, instance, dataset):
        """Return one page of the array data.
        """
        root = get_slumber_root()
        response['instance'] = self(instance, dataset)

        try:
            query = getattr(instance, dataset + '_set')
        except AttributeError:
            query = getattr(instance, dataset)
        query = query.order_by('-pk')
        if request.GET.has_key('start_after'):
            query = query.filter(pk__lt=request.GET['start_after'])

        response['page'] = []
        for obj in query[:10]:
            model = type(obj).slumber_model
            response['page'].append(dict(
                    type=root + model.path,
                    pk=obj.pk, display=unicode(obj),
                    data=model.operations['data'](obj)))

        if query.count() > len(response['page']):
            response['next_page'] = self(instance, dataset,
                start_after=response['page'][-1]['pk'])
Ejemplo n.º 8
0
 def post(self, request, _response, _appname, _modelname, pk):
     """Perform the update.
     """
     instance = self.model.model.objects.get(pk=pk)
     for k, v in request.POST.items():
         setattr(instance, k, v)
     instance.save()
     return HttpResponseRedirect(
         get_slumber_root() + self.model.path + 'data/%s/' % instance.pk)
Ejemplo n.º 9
0
 def do_update(_, request):
     """A function we can decorate which will allow us to use the
     decorator with a dynamic permission name.
     """
     instance = self.model.model.objects.get(pk=pk)
     for k, v in request.POST.items():
         setattr(instance, k, v)
     instance.save()
     response['self'] = dict(url=get_slumber_root() +
         self.model.path + 'data/%s/' % instance.pk)
Ejemplo n.º 10
0
 def do_update(_, request):
     """A function we can decorate which will allow us to use the
     decorator with a dynamic permission name.
     """
     instance = self.model.model.objects.get(pk=pk)
     for k, v in request.POST.items():
         setattr(instance, k, v)
     instance.save()
     response['self'] = dict(url=get_slumber_root() + self.model.path +
                             'data/%s/' % instance.pk)
Ejemplo n.º 11
0
def get_applications(request, response):
    """Return the list of applications and the dataconnection URLs for them.
    """
    root = get_slumber_root()
    if request.GET.has_key('model'):
        appname, modelname = request.GET['model'].split('.')
        for app in applications():
            if app.name.endswith(appname) and app.models.has_key(modelname):
                return HttpResponseRedirect(root + app.models[modelname].path)
        return HttpResponseNotFound()
    response['apps'] = dict([(app.name, root + app.path + '/')
        for app in applications()])
Ejemplo n.º 12
0
    def get(self, request, response, _appname, _modelname):
        """Return a HAL formatted version of the instance list.
        """
        root = get_slumber_root()

        hal = Builder(self())
        hal.add_link('model', root + self.model.path)

        query = self.model.model.objects
        hal_instance_list(self, request.GET, hal, query)

        response["instances"] = hal.as_object()
        response.root = 'instances'
Ejemplo n.º 13
0
 def get(self, request, _response, _appname, _modelname):
     """Work out the correct data URL for an instance we're going to
     search for.
     """
     root = get_slumber_root()
     try:
         instance = self.model.model.objects.get(
             **dict([(k, request.GET[k])
                 for k in request.GET.keys()]))
         return HttpResponseRedirect(
             root + self.model.path + 'data/%s/' % instance.pk)
     except self.model.model.DoesNotExist:
         return HttpResponseNotFound()
Ejemplo n.º 14
0
def get_applications(request, response):
    """Return the list of applications and the data connection URLs for them.
    """
    root = get_slumber_root()
    if request.GET.has_key('model'):
        appname, modelname = request.GET['model'].split('.')
        for app in applications():
            if app.name.endswith(appname) and app.models.has_key(modelname):
                return HttpResponseRedirect(root + app.models[modelname].path)
        return HttpResponseNotFound()
    response['apps'] = dict([(app.name, root + app.path + '/')
                             for app in applications()])
    get_service_directory(request, response)
Ejemplo n.º 15
0
    def get(self, request, response, _appname, _modelname):
        """Return a HAL formatted version of the instance list.
        """
        root = get_slumber_root()

        hal = Builder(self())
        hal.add_link('model', root + self.model.path)

        query = self.model.model.objects
        hal_instance_list(self, request.GET, hal, query)

        response["instances"] = hal.as_object()
        response.root = 'instances'
Ejemplo n.º 16
0
 def post(self, request, response, _appname, _modelname):
     """Perform the authentication.
     """
     # This method can't be a function
     # pylint: disable=R0201
     user = authenticate(**dict([(str(k), str(v))
         for k, v in request.POST.items()]))
     response['authenticated'] = bool(user)
     if user:
         root = get_slumber_root()
         response['user'] = dict(
             pk = user.pk,
             display_name = unicode(user),
             url = root + self.model.path + 'data/%s/' % user.pk)
     else:
         response['user'] = None
Ejemplo n.º 17
0
 def post(self, request, response, _appname, _modelname):
     """Perform the authentication.
     """
     # This method can't be a function
     # pylint: disable=R0201
     user = authenticate(**dict([(str(k), v)
                                 for k, v in request.POST.items()]))
     response['authenticated'] = bool(user)
     if user:
         root = get_slumber_root()
         response['user'] = dict(pk=user.pk,
                                 display_name=unicode(user),
                                 url=root + self.model.path +
                                 'data/%s/' % user.pk)
     else:
         response['user'] = None
Ejemplo n.º 18
0
def get_model(_, response, appname, modelname):
    """Return meta data about the model.
    """
    app = get_application(appname)
    model = app.models[modelname]
    response['name'] = model.name
    response['module'] = model.app.name
    response['fields'] = model.fields
    # We have to access _meta
    # pylint: disable=W0212
    response['puttable'] = [[f] for f in model.fields
        if model.model._meta.get_field(f).unique] + \
        list(model.model._meta.unique_together)
    response['data_arrays'] = model.data_arrays
    response['operations'] = dict(
        [(op.name, get_slumber_root() + op.path)
            for op in model.operations() if op.model_operation])
Ejemplo n.º 19
0
    def get(self, request, response, _appname, _modelname):
        """Return a paged set of instances for this model.
        """
        root = get_slumber_root()
        response['model'] = root + self.model.path

        query = self.model.model.objects.order_by('-pk')
        if request.GET.has_key('start_after'):
            query = query.filter(pk__lt=request.GET['start_after'])

        response['page'] = [
                dict(pk=o.pk, display=unicode(o),
                    data=root + self.model.path + 'data/%s/' % o.pk)
            for o in query[:10]]
        if len(response['page']) > 0:
            response['next_page'] = root +self.model.path + \
                'instances/?start_after=%s' % response['page'][-1]['pk']
Ejemplo n.º 20
0
def get_model(_, response, model):
    """Return meta data about the model.
    """
    if not model:
        return HttpResponseNotFound()
    root = get_slumber_root()
    response['name'] = model.name
    response['module'] = model.app.name
    response['fields'] = model.fields
    response['puttable'] = [[f] for f, p in model.fields.items()
            if p['kind'] != 'property' and
                model.model._meta.get_field(f).unique] + \
        list(model.model._meta.unique_together)
    response['data_arrays'] = model.data_arrays
    response['operations'] = dict(
        [(op.name, root + op.path)
            for op in model.operations() if op.model_operation])
Ejemplo n.º 21
0
def get_model(_, response, model):
    """Return meta data about the model.
    """
    if not model:
        return HttpResponseNotFound()
    root = get_slumber_root()
    response['name'] = model.name
    response['module'] = model.app.name
    response['fields'] = model.fields
    response['puttable'] = [[f] for f, p in model.fields.items()
            if p['kind'] != 'property' and
                model.model._meta.get_field(f).unique] + \
        list(model.model._meta.unique_together)
    response['data_arrays'] = model.data_arrays
    response['operations'] = dict([(op.name, root + op.path)
                                   for op in model.operations()
                                   if op.model_operation])
Ejemplo n.º 22
0
    def get(self, request, response, _appname, _modelname):
        """Return a paged set of instances for this model.
        """
        root = get_slumber_root()
        response['model'] = root + self.model.path

        query = self.model.model.objects.order_by('-pk')
        if request.GET.has_key('start_after'):
            query = query.filter(pk__lt=request.GET['start_after'])

        response['page'] = [
            dict(pk=o.pk,
                 display=unicode(o),
                 data=self.model.operations['data'](o)) for o in query[:10]
        ]
        if len(response['page']) > 0:
            response['next_page'] = self(
                start_after=response['page'][-1]['pk'])
Ejemplo n.º 23
0
 def __call__(self, *args, **qs):
     root = get_slumber_root()
     uri = self.uri or (root + self.path)
     for part in args:
         if issubclass(type(part), Model):
             part = part.pk
         part = str(part)
         if part.startswith('/'):
             if part.startswith(root):
                 uri = part
             else:
                 uri = root + part[1:]
         else:
             uri += quote(part)
         if not uri.endswith('/'):
             uri += '/'
     if qs:
         uri += '?' + urlencode(qs)
     return uri
Ejemplo n.º 24
0
 def __call__(self, *args, **qs):
     root = get_slumber_root()
     uri = self.uri or (root + self.path)
     for part in args:
         if issubclass(type(part), Model):
             part = part.pk
         part = str(part)
         if part.startswith('/'):
             if part.startswith(root):
                 uri = part
             else:
                 uri = root + part[1:]
         else:
             uri += quote(part)
         if not uri.endswith('/'):
             uri += '/'
     if qs:
         uri += '?' + urlencode(qs)
     return uri
Ejemplo n.º 25
0
 def fields(self):
     """Return the non-array fields.
     """
     self._get_fields_and_data_arrays()
     fields = {}
     for field, definition in self._fields.items():
         field_type = type(definition)
         if field_type == ForeignKey:
             fields[field] = dict(
                 name=field,
                 kind='object',
                 type= get_slumber_root() +
                     DJANGO_MODEL_TO_SLUMBER_MODEL[definition.rel.to].path,
                 verbose_name=definition.verbose_name)
         else:
             type_name = field_type.__module__ + '.' + \
                 field_type.__name__
             fields[field] = dict(name=field,
                 kind='value', type=type_name,
                 verbose_name=definition.verbose_name)
     return fields
Ejemplo n.º 26
0
def instance_data(into, model, instance):
    """Fill in the dict `into` with information about the instance of the
    specified model.
    """
    root = get_slumber_root()
    into['type'] = root + model.path
    into['identity'] = root + model.path + \
        '%s/%s/' % ('data', instance.pk)
    into['display'] = unicode(instance)
    into['operations'] = dict(
        [(op.name, op(instance))
            for op in model.operations.values() if not op.model_operation])
    into['fields'] = {}
    for field, meta in model.fields.items():
        into['fields'][field] = dict(
            data=to_json_data(model, instance, field, meta),
            kind=meta['kind'], type=meta['type'])
    into['data_arrays'] = {}
    for field in model.data_arrays:
        into['data_arrays'][field] = \
            into['identity'] + '%s/' % field
Ejemplo n.º 27
0
def to_json_data(model, instance, fieldname, fieldmeta):
    """Convert a model field to JSON on the server.
    """
    value = getattr(instance, fieldname)
    if fieldmeta['kind'] == 'object':
        if value is None:
            return None
        else:
            rel_to = DJANGO_MODEL_TO_SLUMBER_MODEL[type(value)]
            root = get_slumber_root()
            return dict(type=root + rel_to.path,
                display=unicode(value),
                data=root + rel_to.path + 'data/%s/' % value.pk)
    elif DATA_MAPPING.has_key(fieldmeta['type']):
        func = DATA_MAPPING[fieldmeta['type']]
        return func(model, instance, fieldmeta, value)
    else:
        if value is None:
            return None
        else:
            return unicode(value)
Ejemplo n.º 28
0
def to_json_data(model, instance, fieldname, fieldmeta):
    """Convert a model field to JSON on the server.
    """
    value = getattr(instance, fieldname)
    if fieldmeta['kind'] == 'object':
        if value is None:
            return None
        else:
            rel_to = DJANGO_MODEL_TO_SLUMBER_MODEL[type(value)]
            root = get_slumber_root()
            return dict(type=root + rel_to.path,
                        display=unicode(value),
                        data=root + rel_to.path + 'data/%s/' % value.pk)
    elif DATA_MAPPING.has_key(fieldmeta['type']):
        func = DATA_MAPPING[fieldmeta['type']]
        return func(model, instance, fieldmeta, value)
    else:
        if value is None:
            return None
        else:
            return unicode(value)
Ejemplo n.º 29
0
def instance_data(into, model, instance):
    """Fill in the dict `into` with information about the instance of the
    specified model.
    """
    root = get_slumber_root()
    into['type'] = root + model.path
    into['identity'] = root + model.path + \
        '%s/%s/' % ('data', instance.pk)
    into['display'] = unicode(instance)
    into['operations'] = dict(
        [(op.name, root + op.path + '%s/' % instance.pk)
            for op in model.operations() if not op.model_operation])
    into['fields'] = {}
    for field, meta in model.fields.items():
        into['fields'][field] = dict(
            data=to_json_data(model, instance, field, meta),
            kind=meta['kind'], type=meta['type'])
    into['data_arrays'] = {}
    for field in model.data_arrays:
        into['data_arrays'][field] = \
            into['identity'] + '%s/' % field
Ejemplo n.º 30
0
def get_models(_, response, app):
    """Return the models that comprise an application.
    """
    root = get_slumber_root()
    response['models'] = dict([(n, root + m.path)
                               for n, m in app.models.items()])