# -*- coding: utf-8 -*- # vi:si:et:sw=4:sts=4:ts=4 from __future__ import division import os.path import re from datetime import datetime from urllib2 import unquote import mimetypes from django import forms from django.core.paginator import Paginator from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.db.models import Q, Avg, Count, Sum from django.http import HttpResponse, Http404 from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404, redirect from django.template import RequestContext from django.conf import settings from ox.utils import json from ox.django.decorators import login_required_json from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response from ox.django.http import HttpFileResponse import ox import models ''' fixme, require admin ''' @login_required_json def api_addPlace(request): ''' param data { 'place': dict } place contains key/value pairs with place propterties ''' data = json.loads(request.POST['data']) exists = False names = [data['place']['name']] + data['place']['aliases'] for name in names: if models.Place.objects.filter(name_find__icontains=u'|%s|'%data['name']).count() != 0: exists = True if not exists: place = models.Place() for key in data['place']: setattr(place, key, data['place'][key]) place.save() response = json_response(status=200, text='created') else: response = json_response(status=403, text='place name exists') return render_to_json_response(response) @login_required_json def api_editPlace(request): ''' param data { 'id': placeid, 'place': dict } place contains key/value pairs with place propterties ''' data = json.loads(request.POST['data']) place = get_object_or_404_json(models.Place, pk=data['id']) if place.editable(request.user): conflict = False names = [data['place']['name']] + data['place']['aliases'] for name in names: if models.Place.objects.filter(name_find__icontains=u'|%s|'%data['name']).exclude(id=place.id).count() != 0: conflict = True if not conflict: for key in data['place']: setattr(place, key, data['place'][key]) place.save() response = json_response(status=200, text='updated') else: response = json_response(status=403, text='place name/alias conflict') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response) @login_required_json def api_removePlace(request): response = json_response(status=501, text='not implemented') return render_to_json_response(response) def api_findPlace(request): ''' param data {'query': query, 'sort': array, 'range': array, 'area': 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] area: [sw_lat, sw_lng, ne_lat, ne_lng] only return places in that square with keys, items is list of dicts with requested properties: return {'status': {'code': int, 'text': string}, 'data': {items: array}} Positions param data {'query': query, 'ids': []} query: query object, more on query syntax at https://wiki.0x2620.org/wiki/pandora/QuerySyntax ids: ids of places for which positions are required ''' data = json.loads(request.POST['data']) response = json_response(status=200, text='ok') response['data']['places'] = [] #FIXME: add coordinates to limit search for p in Places.objects.find(data['query']): response['data']['places'].append(p.json()) return render_to_json_response(response)