def list(self, other_pks=None, filters=None): ''' List returns back list of URI In case of multiple pks, We guess the pk by using '<modelname>_id' as the field convention ''' try: pk = primary_key(self.cls) except KeyNotFoundException: pk = None filter_dict = dict() if filters: filter_dict = {k: v for k, v in filters.iteritems()} filter_dict.pop('format', None) filter_dict.pop('page', None) filter_dict.pop('sort_by', None) if other_pks: query_pks = dict() # Use only those keys which are primary keys # and pick them up from the passed dict for key in class_keys(self.cls): if key in other_pks: query_pks[key] = other_pks[key] query_pks.update(filter_dict) if pk: queryset = self.session.query(self.cls.__dict__[pk]).filter_by( **query_pks).all() else: queryset = self.session.query(self.cls).filter_by( **query_pks).all() else: if filter_dict: if pk: queryset = self.session.query( self.cls.__dict__[pk]).filter_by( **filter_dict).all() else: queryset = self.session.query(self.cls).filter_by( **filter_dict).all() else: if pk: queryset = self.session.query(self.cls.__dict__[pk]).all() else: # Limit to 1000 rows, this is worst case scenario queryset = self.session.query(self.cls).limit(1000).all() return queryset
def get_default_fields(self): ret = SortedDict() try: # URI field for get pk field pk_field = primary_key(self.cls.__class__) except KeyNotFoundException: return ret request = self.context['request'] ret["href"] = AlchemyUriField(source=pk_field, path=request.build_absolute_uri( request.path)) return ret
def get_default_fields(self): ret = SortedDict() mapper = class_mapper(self.cls.__class__) try: # URI field for get pk field pk_field = primary_key(self.cls.__class__) except KeyNotFoundException: return ret r = self.context['request'] ret['href'] = AlchemyUriField(source=pk_field, path=r.build_absolute_uri(r.path)) # Get all the Column fields for col_prop in mapper.iterate_properties: if isinstance(col_prop, ColumnProperty): field_nm = str(col_prop).split('.')[1] field_cls = col_prop.columns[0].type.__class__ assert field_cls in self.field_mapping, \ "Field %s has not been mapped" % field_cls ret[field_nm] = self.field_mapping[field_cls]() # Get all the relationship fields for rel_prop in mapper.iterate_properties: if isinstance(rel_prop, RelationshipProperty): field_nm = str(rel_prop).split('.')[1] # many becomes same as uselist so that # RelatedField can iterate over the queryset ret[field_nm] = AlchemyRelatedField(source=field_nm, many=rel_prop.uselist, path=r.build_absolute_uri( r.path)) return ret
def list(self, other_pks=None, filters=None): ''' List returns back list of URI In case of multiple pks, We guess the pk by using '<modelname>_id' as the field convention ''' try: pk = primary_key(self.cls) except KeyNotFoundException: return list() filter_dict = dict() if filters: filter_dict = {k: v for k, v in filters.iteritems()} filter_dict.pop('format', None) filter_dict.pop('page', None) filter_dict.pop('sort_by', None) if other_pks: query_pks = dict() # Use only those keys which are primary keys # and pick them up from the passed dict for key in class_keys(self.cls): if key in other_pks: query_pks[key] = other_pks[key] query_pks.update(filter_dict) queryset = self.session.query( self.cls.__dict__[pk]).filter_by(**query_pks).all() else: if filter_dict: queryset = self.session.query( self.cls.__dict__[pk]).filter_by(**filter_dict).all() else: queryset = self.session.query(self.cls.__dict__[pk]).all() return queryset