def findLogs(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, sort: [{key: 'created', operator: '+'}], range: [int, int] keys: [string] } returns { items: [object] } ''' data = json.loads(request.POST['data']) response = json_response() query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) qs = qs.distinct() if 'keys' in data: qs = qs.select_related() qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [p.json(data['keys']) for p in qs] elif 'position' in query: ids = [i.get_id() for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [ox.toAZ(i.id) for i in qs] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findAnnotations(request): ''' takes { query: { conditions: [], operator: '&' }, itemsQuery: { conditions: [], operator: '&' }, keys: [], position: int, positions: [], range: [in, out], sort: [] } returns { annotations = [{..}, {...}, ...] } ''' data = json.loads(request.POST['data']) response = json_response() query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if 'keys' in data: qs = qs.select_related()[query['range'][0]:query['range'][1]] response['data']['items'] = [p.json(keys=data['keys']) for p in qs] elif 'position' in query: ids = [i.public_id for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions( ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [i.public_id for i in qs] response['data']['positions'] = utils.get_positions( ids, data['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findAnnotations(request): ''' takes { query: { conditions: [], operator: '&' }, itemsQuery: { conditions: [], operator: '&' }, keys: [], position: int, positions: [], range: [in, out], sort: [] } returns { annotations = [{..}, {...}, ...] } ''' data = json.loads(request.POST['data']) response = json_response() query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if 'keys' in data: qs = qs.select_related()[query['range'][0]:query['range'][1]] response['data']['items'] = [p.json(keys=data['keys']) for p in qs] elif 'position' in query: ids = [i.public_id for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [i.public_id for i in qs] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findSequences(request): ''' takes { query: ... itemsQuery: ... } one of your conditions has to be key: 'mode', value: [shape,color], operator: '==' returns { items: [object] } ''' data = json.loads(request.POST['data']) response = json_response() query = parse_query(data, request.user) qs = query['qs'] if 'keys' in data: qs = order_query(qs, query['sort']) qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [p.json(data['keys'], request.user) for p in qs] elif 'position' in query: qs = order_query(qs, query['sort']) ids = [i['public_id'] for i in qs.values('public_id')] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: qs = order_query(qs, query['sort']) ids = [i['public_id'] for i in qs.values('public_id')] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findDocuments(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, sort: [{key: 'name', operator: '+'}], range: [0, 100] keys: [] } possible query keys: name, user, extension, size possible keys: name, user, extension, size } returns { items: [object] } ''' data = json.loads(request.POST['data']) query = parse_query(data, request.user) #order qs = _order_query(query['qs'], query['sort']) response = json_response() if 'keys' in data: qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [ l.json(data['keys'], request.user) for l in qs ] elif 'position' in data: #FIXME: actually implement position requests response['data']['position'] = 0 elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions( ids, query['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findDocuments(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, sort: [{key: 'name', operator: '+'}], range: [0, 100] keys: [] } possible query keys: name, user, extension, size possible keys: name, user, extension, size } returns { items: [object] } ''' data = json.loads(request.POST['data']) query = parse_query(data, request.user) #order qs = _order_query(query['qs'], query['sort']) response = json_response() if 'keys' in data: qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [l.json(data['keys'], request.user) for l in qs] elif 'position' in data: #FIXME: actually implement position requests response['data']['position'] = 0 elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions(ids, query['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findTexts(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, sort: [{key: 'name', operator: '+'}], range: [0, 100] keys: [] } possible query keys: name, user, featured, subscribed possible keys: name, user, featured, subscribed, query } returns { items: [object] } ''' data = json.loads(request.POST['data']) query = parse_query(data, request.user) #order is_section_request = query['sort'] == [{u'operator': u'+', u'key': u'position'}] def is_featured_condition(x): return x['key'] == 'status' and \ x['value'] == 'featured' and \ x['operator'] in ('=', '==') is_featured = len(filter(is_featured_condition, data['query'].get('conditions', []))) > 0 if is_section_request: qs = query['qs'] if not is_featured and not request.user.is_anonymous(): qs = qs.filter(position__in=models.Position.objects.filter(user=request.user)) qs = qs.order_by('position__position') else: qs = _order_query(query['qs'], query['sort']) response = json_response() if 'keys' in data: qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [l.json(data['keys'], request.user) for l in qs] elif 'position' in data: #FIXME: actually implement position requests response['data']['position'] = 0 elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions(ids, query['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findMedia(request): ''' takes { 'query': query, 'sort': array, 'range': array } query: item query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax get media for all items matching the given query sort: array of key, operator dics [ { key: "year", operator: "-" }, { key: "director", operator: "" } ] range: result range, array [from, to] keys: array of keys to return group: group elements by, country, genre, director... with keys, items is list of dicts with requested properties: returns { items: [object] } Groups takes { 'query': query, 'key': string, 'group': string, 'range': array } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax range: result range, array [from, to] keys: array of keys to return group: group elements by, country, genre, director... possible values for keys: path, items with keys items contains list of {'path': string, 'items': int}: returns { items: [object] } without keys: return number of items in given query returns { items: int } Positions takes { 'query': query, 'positions': [string] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax positions: ids of items for which positions are required returns { positions: { id: position } } ''' data = json.loads(request.POST['data']) if not data.get('sort'): data['sort'] = [{'key': 'path', 'operator': '+'}] query = parse_query(data, request.user) response = json_response({}) if 'group' in query: if 'sort' in query: if len(query['sort']) == 1 and query['sort'][0]['key'] == 'items': if query['group'] == "year": order_by = query['sort'][0][ 'operator'] == '-' and 'items' or '-items' else: order_by = query['sort'][0][ 'operator'] == '-' and '-items' or 'items' if query['group'] != "keyword": order_by = (order_by, 'sortvalue') else: order_by = (order_by, ) else: order_by = query['sort'][0][ 'operator'] == '-' and '-sortvalue' or 'sortvalue' order_by = (order_by, 'items') else: order_by = ('-sortvalue', 'items') response['data']['items'] = [] items = 'items' item_qs = query['qs'] qs = models.Facet.objects.filter(key=query['group']).filter( item__id__in=item_qs) qs = qs.values('value').annotate(items=Count('id')).order_by(*order_by) if 'positions' in query: #FIXME: this does not scale for larger results response['data']['positions'] = {} ids = [j['value'] for j in qs] response['data']['positions'] = utils.get_positions( ids, query['positions']) elif 'range' in data: qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [{ 'path': i['value'], 'items': i[items] } for i in qs] else: response['data']['items'] = qs.count() elif 'positions' in query: #FIXME: this does not scale for larger results qs = models.File.objects.filter(item__in=query['qs']) qs = _order_query(qs, query['sort']) response['data']['positions'] = {} ids = [j['oshash'] for j in qs.values('oshash')] response['data']['positions'] = utils.get_positions( ids, query['positions']) elif 'keys' in query: response['data']['items'] = [] qs = models.File.objects.filter(item__in=query['qs']) qs = _order_query(qs, query['sort']) qs = qs.select_related() keys = query['keys'] qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [f.json(keys) for f in qs] else: # otherwise stats items = query['qs'] files = models.File.objects.filter(item__in=query['qs']) response['data']['items'] = files.count() return render_to_json_response(response)
def findPlaces(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, itemsQuery: { //see find request }, sort: [{key: 'name', operator: '+'}], range: [int, int] keys: [string] } possible query keys: name, geoname, user itemsQuery can be used to limit the resuts to matches in those items. Uses the same query syntax as used in the find request. possible keys: name, geoname, user returns { items: [object] } takes { query: object, sort: [object] range: [int, int] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax sort: array of key, operator dics [ { key: "year", operator: "-" }, { key: "director", operator: "" } ] range: result range, array [from, to] with keys, items is list of dicts with requested properties: returns { items: [string] } Positions takes { query: object, positions: [string] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax positions: ids of places for which positions are required ''' data = json.loads(request.POST['data']) response = json_response() query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) qs = qs.distinct() if 'keys' in data: qs = qs.select_related('user__profile') qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [p.json(data['keys'], request.user) for p in qs] elif 'position' in query: ids = [i.get_id() for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: response['data']['items'] = qs.count() response['data']['area'] = qs.aggregate( south=Min('south'), west=Min('west'), north=Max('north'), east=Max('east'), ) return render_to_json_response(response)
def findUsers(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, sort: [{key: 'username', operator: '+'}], range: [0, 100] keys: [] } possible query keys: username, email, lastLogin, browser returns { items: [ {name:, user:, featured:, public...} ] } takes { query: query, sort: array, range: array } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax sort: array of key, operator dics [ { key: "year", operator: "-" }, { key: "director", operator: "" } ] range: result range, array [from, to] with keys, items is list of dicts with requested properties: returns { items: [object] } Positions takes { query: query, positions: [] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax positions: ids of places for which positions are required ''' response = json_response(status=200, text='ok') data = json.loads(request.POST['data']) query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if 'keys' in data: qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [p.json(data['keys'], request.user) for p in qs] elif 'position' in query: ids = [i.get_id() for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: response['data']['items'] = qs.count() response['data']['users'] = qs.exclude(user=None).count() response['data']['robots'] = qs.filter(level=-1).count() response['data']['guests'] = qs.filter(level=0).count() return render_to_json_response(response)
def findEdits(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, sort: [{key: 'name', operator: '+'}], range: [0, 100] keys: [] } possible query keys: name, user, featured, subscribed possible keys: name, user, featured, subscribed, query } returns { items: [object] } ''' data = json.loads(request.POST['data']) query = parse_query(data, request.user) #order is_section_request = query['sort'] == [{u'operator': u'+', u'key': u'position'}] def is_featured_condition(x): return x['key'] == 'status' and \ x['value'] == 'featured' and \ x['operator'] in ('=', '==') is_featured = len(filter(is_featured_condition, data['query'].get('conditions', []))) > 0 if is_section_request: qs = query['qs'] if not is_featured and not request.user.is_anonymous(): qs = qs.filter(position__in=models.Position.objects.filter(user=request.user)) qs = qs.order_by('position__position') else: qs = _order_query(query['qs'], query['sort']) response = json_response() if 'keys' in data: qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [l.json(data['keys'], request.user) for l in qs] elif 'position' in data: #FIXME: actually implement position requests response['data']['position'] = 0 elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions(ids, query['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findEvents(request): ''' takes { query: object, sort: array range': [int, int] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax itemsQuery: { //see find request }, sort: array of key, operator dics [ { key: "year", operator: "-" }, { key: "director", operator: "" } ] range: result range, array [from, to] itemsQuery can be used to limit the resuts to matches in those items. with keys, items is list of dicts with requested properties: returns {'status': {'code': int, 'text': string}, 'data': {items: array}} Positions takes { query: object, ids: [string] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax ids: ids of events for which positions are required ''' response = json_response(status=200, text='ok') data = json.loads(request.POST['data']) query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) qs = qs.distinct() if 'keys' in data: qs = qs[query['range'][0]:query['range'][1]] qs = qs.select_related() response['data']['items'] = [p.json(request.user) for p in qs] elif 'position' in query: ids = [i.get_id() for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findMedia(request): ''' takes { 'query': query, 'sort': array, 'range': array } query: item query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax get media for all items matching the given query sort: array of key, operator dics [ { key: "year", operator: "-" }, { key: "director", operator: "" } ] range: result range, array [from, to] keys: array of keys to return group: group elements by, country, genre, director... with keys, items is list of dicts with requested properties: returns { items: [object] } Groups takes { 'query': query, 'key': string, 'group': string, 'range': array } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax range: result range, array [from, to] keys: array of keys to return group: group elements by, country, genre, director... possible values for keys: path, items with keys items contains list of {'path': string, 'items': int}: returns { items: [object] } without keys: return number of items in given query returns { items: int } Positions takes { 'query': query, 'positions': [string] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax positions: ids of items for which positions are required returns { positions: { id: position } } ''' data = json.loads(request.POST['data']) if not data.get('sort'): data['sort'] = [{'key': 'path', 'operator': '+'}] query = parse_query(data, request.user) response = json_response({}) if 'group' in query: if 'sort' in query: if len(query['sort']) == 1 and query['sort'][0]['key'] == 'items': if query['group'] == "year": order_by = query['sort'][0]['operator'] == '-' and 'items' or '-items' else: order_by = query['sort'][0]['operator'] == '-' and '-items' or 'items' if query['group'] != "keyword": order_by = (order_by, 'sortvalue') else: order_by = (order_by,) else: order_by = query['sort'][0]['operator'] == '-' and '-sortvalue' or 'sortvalue' order_by = (order_by, 'items') else: order_by = ('-sortvalue', 'items') response['data']['items'] = [] items = 'items' item_qs = query['qs'] qs = models.Facet.objects.filter(key=query['group']).filter(item__id__in=item_qs) qs = qs.values('value').annotate(items=Count('id')).order_by(*order_by) if 'positions' in query: #FIXME: this does not scale for larger results response['data']['positions'] = {} ids = [j['value'] for j in qs] response['data']['positions'] = utils.get_positions(ids, query['positions']) elif 'range' in data: qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [{'path': i['value'], 'items': i[items]} for i in qs] else: response['data']['items'] = qs.count() elif 'positions' in query: #FIXME: this does not scale for larger results qs = models.File.objects.filter(item__in=query['qs']) qs = _order_query(qs, query['sort']) response['data']['positions'] = {} ids = [j['oshash'] for j in qs.values('oshash')] response['data']['positions'] = utils.get_positions(ids, query['positions']) elif 'keys' in query: response['data']['items'] = [] qs = models.File.objects.filter(item__in=query['qs']) qs = _order_query(qs, query['sort']) qs = qs.select_related() keys = query['keys'] qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [f.json(keys) for f in qs] else: # otherwise stats items = query['qs'] files = models.File.objects.filter(item__in=query['qs']) response['data']['items'] = files.count() return render_to_json_response(response)
def findEvents(request): ''' takes { query: object, sort: array range': [int, int] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax itemsQuery: { //see find request }, sort: array of key, operator dics [ { key: "year", operator: "-" }, { key: "director", operator: "" } ] range: result range, array [from, to] itemsQuery can be used to limit the resuts to matches in those items. with keys, items is list of dicts with requested properties: returns {'status': {'code': int, 'text': string}, 'data': {items: array}} Positions takes { query: object, ids: [string] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax ids: ids of events for which positions are required ''' response = json_response(status=200, text='ok') data = json.loads(request.POST['data']) query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) qs = qs.distinct() if 'keys' in data: qs = qs[query['range'][0]:query['range'][1]] qs = qs.select_related() response['data']['items'] = [p.json(request.user) for p in qs] elif 'position' in query: ids = [i.get_id() for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions( ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions( ids, data['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findClips(request): ''' takes { query: { conditions: [object], operator: string // '&' or '|' }, itemsQuery: { conditions: [], operator: string // '&' or '|' }, keys: [string], position: int, positions: [string], range: [int, int], sort: [] } returns { items: [object] } ''' data = json.loads(request.POST['data']) response = json_response() query = parse_query(data, request.user) qs = query['qs'] if 'keys' in data: qs = order_query(qs, query['sort']) qs = qs[query['range'][0]:query['range'][1]] ids = [] keys = filter(lambda k: k not in settings.CONFIG['clipLayers'] + ['annotations'], data['keys']) if filter(lambda k: k not in models.Clip.clip_keys, keys): qs = qs.select_related('sort') def add(p): ids.append(p.id) return p.json(keys=keys) response['data']['items'] = [add(p) for p in qs] keys = data['keys'] def clip_public_id(c): return u'%s/%0.03f-%0.03f' % (c['public_id'].split('/')[0], c['clip__start'], c['clip__end']) def add_annotations(key, qs, add_layer=False): values = ['public_id', 'value', 'clip__start', 'clip__end'] subtitles = utils.get_by_key(settings.CONFIG['layers'], 'isSubtitles', True) if subtitles or add_layer: values.append('layer') if query['filter']: qs = qs.filter(query['filter']) for a in qs.values(*values): public_id = clip_public_id(a) for i in response['data']['items']: if i['id'] == public_id: if not key in i: i[key] = [] l = { 'id': a['public_id'], 'value': a['value'], } if subtitles and a['layer'] == subtitles['id'] and not a['value']: del l['id'] if add_layer: l['layer'] = a['layer'] i[key].append(l) if response['data']['items']: if 'annotations' in keys: aqs = Annotation.objects.filter(layer__in=settings.CONFIG['clipLayers'], clip__in=ids) add_annotations('annotations',aqs , True) for layer in filter(lambda l: l in keys, settings.CONFIG['clipLayers']): aqs = Annotation.objects.filter(layer=layer, clip__in=ids) add_annotations(layer, aqs) elif 'position' in query: qs = order_query(qs, query['sort']) ids = [u'%s/%0.03f-%0.03f' % (c['item__itemId'], c['start'], c['end']) for c in qs.values('item__itemId', 'start', 'end')] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: qs = order_query(qs, query['sort']) ids = [u'%s/%0.03f-%0.03f' % (c['item__itemId'], c['start'], c['end']) for c in qs.values('item__itemId', 'start', 'end')] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findUsers(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, sort: [{key: 'username', operator: '+'}], range: [0, 100] keys: [] } possible query keys: username, email, lastLogin, browser returns { items: [ {name:, user:, featured:, public...} ] } takes { query: query, sort: array, range: array } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax sort: array of key, operator dics [ { key: "year", operator: "-" }, { key: "director", operator: "" } ] range: result range, array [from, to] with keys, items is list of dicts with requested properties: returns { items: [object] } Positions takes { query: query, positions: [] } query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax positions: ids of places for which positions are required ''' response = json_response(status=200, text='ok') data = json.loads(request.POST['data']) query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if 'keys' in data: qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [ p.json(data['keys'], request.user) for p in qs ] elif 'position' in query: ids = [i.get_id() for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions( ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions( ids, data['positions']) else: response['data']['items'] = qs.count() response['data']['users'] = qs.exclude(user=None).count() response['data']['robots'] = qs.filter(level=-1).count() response['data']['guests'] = qs.filter(level=0).count() return render_to_json_response(response)
def findNames(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, itemsQuery: { //see find request }, sort: [{key: 'name', operator: '+'}], range: [0, 100] keys: [] } possible query keys: name, numberofnames possible keys: name, sortname, numberofnames returns { items: [{name:, user:, featured:, public...}] } param data {'query': query, 'sort': array, 'range': array} query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax sort: array of key, operator dics [ { key: "year", operator: "-" }, { key: "director", operator: "" } ] range: result range, array [from, to] with keys, items is list of dicts with requested properties: returns { items: [string] } ''' data = json.loads(request.POST['data']) response = json_response() query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) qs = qs.distinct() if 'keys' in data: qs = qs.select_related() qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [p.json(data['keys'], request.user) for p in qs] elif 'position' in query: ids = [i.get_id() for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)
def findNames(request): ''' takes { query: { conditions: [ { key: 'user', value: 'something', operator: '=' } ] operator: "," }, itemsQuery: { //see find request }, sort: [{key: 'name', operator: '+'}], range: [0, 100] keys: [] } possible query keys: name, numberofnames possible keys: name, sortname, numberofnames returns { items: [{name:, user:, featured:, public...}] } param data {'query': query, 'sort': array, 'range': array} query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax sort: array of key, operator dics [ { key: "year", operator: "-" }, { key: "director", operator: "" } ] range: result range, array [from, to] with keys, items is list of dicts with requested properties: returns { items: [string] } ''' data = json.loads(request.POST['data']) response = json_response() query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) qs = qs.distinct() if 'keys' in data: qs = qs.select_related() qs = qs[query['range'][0]:query['range'][1]] response['data']['items'] = [ p.json(data['keys'], request.user) for p in qs ] elif 'position' in query: ids = [i.get_id() for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], 'key': query['sort'][0]['key'], 'operator': '^' } query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if qs.count() > 0: response['data']['position'] = utils.get_positions( ids, [qs[0].itemId])[0] elif 'positions' in data: ids = [i.get_id() for i in qs] response['data']['positions'] = utils.get_positions( ids, data['positions']) else: response['data']['items'] = qs.count() return render_to_json_response(response)