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'])
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
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()])
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'])
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
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)
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)
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)
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()])
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'
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()
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)
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
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
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])
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']
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])
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])
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'])
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
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
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
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)
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
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()])