gazetteer/gazetteer/places/views.py

142 lines
5.3 KiB
Python
Raw Normal View History

2011-08-18 22:44:56 +05:30
# Create your views here.
2011-08-29 18:25:00 +05:30
from django.shortcuts import render_to_response, get_object_or_404
2011-08-31 18:50:16 +05:30
from ox.django.shortcuts import render_to_json_response, get_object_or_404_json
from django.template import RequestContext
2011-09-01 09:19:46 +02:00
from models import Feature, FeatureType, AuthorityRecord, Relationship
from django.core.exceptions import ObjectDoesNotExist
2011-08-31 17:44:02 +05:30
from django.core.paginator import Paginator, InvalidPage, EmptyPage
def search(request):
d = RequestContext(request, {})
return render_to_response("search.html", d)
def search_json(request):
2011-08-31 17:35:34 +05:30
search_term = request.GET.get("q", "")
2011-08-31 19:07:47 +05:30
threshold = float(request.GET.get("threshold", '0.5'))
2011-08-28 04:57:53 +05:30
bbox = request.GET.get("bbox", False)
2011-08-31 19:07:47 +05:30
page = int(request.GET.get("page", '1'))
count = int(request.GET.get("count", '100'))
country = request.GET.get("adm0", "US") # right now, unused
adm1 = request.GET.get("adm1", "")
adm2 = request.GET.get("adm2", "")
srid = int(request.GET.get("srid", 4326))
2011-08-30 17:47:57 -07:00
if threshold:
try:
threshold = float(threshold)
except ValueError:
return render_to_json_response({'error': 'threshold must be a float'})
if bbox:
try:
bbox = map(float, bbox.split(","))
except ValueError:
bbox = None
2011-08-31 15:49:39 +05:30
return render_to_json_response({'error': 'bbox must be in the form: minx,miny,maxx,maxy'})
2011-08-30 17:47:57 -07:00
if not bbox and not search_term:
return render_to_json_response({'error': 'must supply either a valid `bbox` or a `search` parameter'})
2011-08-31 17:44:02 +05:30
features_qset = Feature.search.find(bbox=bbox, text=search_term, threshold=threshold, adm1=adm1, adm2=adm2, srid=srid)
total_results = features_qset.count()
paginator = Paginator(features_qset, count)
num_pages = paginator.num_pages
try:
results = paginator.page(page)
except (EmptyPage, InvalidPage):
results = paginator.page(paginator.num_pages)
features = [f.get_geojson(srid) for f in results.object_list]
2011-08-29 05:52:27 +05:30
d = {
'type': 'FeatureCollection',
2011-08-31 17:44:02 +05:30
'results': total_results,
'current_page': page,
'pages': num_pages,
2011-08-29 05:52:27 +05:30
'features': features
}
return render_to_json_response(d)
2011-08-31 18:50:16 +05:30
def search_related_json(request, id):
# id = request.GET.get("id", "0")
2011-08-31 18:55:45 +05:30
id = str(id)
2011-08-31 18:50:16 +05:30
feature = get_object_or_404_json(Feature, pk=id)
similar_features = feature.similar_features()
d = []
2011-09-01 09:19:46 +02:00
for s in similar_features:
time_frame = relates_to = related_by = ""
2011-08-31 21:51:56 -07:00
if s.time_frame is not None:
time_frame = s.time_frame.description
2011-09-01 09:19:46 +02:00
if s.relationship_type is not None:
if s.feature2_id == s.id:
2011-09-01 09:19:46 +02:00
relates_to = s.relationship_type
elif s.feature1_id == s.id:
related_by = s.relationship_type
d.append({
'id': s.id,
2011-08-31 21:51:56 -07:00
'feature_type': s.feature_type.name, #FeatureType.objects.get(pk=s.feature_type_id).name,
'preferred_name': s.preferred_name,
'similarity': s.similarity,
'distance': s.distance,
'time_frame': time_frame,
'is_primary': s.is_primary,
2011-09-01 09:19:46 +02:00
'relates_to': relates_to,
'related_by': related_by
})
return render_to_json_response(d)
def auth_record_json(request):
id = request.GET.get("id", "0")
2011-09-01 03:36:16 +05:30
auth_record = get_object_or_404_json(AuthorityRecord, pk=id)
features = [f.get_geojson() for f in auth_record.feature_set.all()]
d = {
'type': 'FeatureCollection',
'features': features
}
return render_to_json_response(d)
2011-09-01 03:36:16 +05:30
def time_frame_json(request):
2011-09-01 03:46:50 +05:30
id = request.GET.get("id", "0")
2011-09-01 03:36:16 +05:30
time_frame = get_object_or_404_json(AuthorityRecord, pk=id)
features = [f.get_geojson() for f in time_frame.feature_set.all()]
d = {
'type': 'FeatureCollection',
'features': features
}
return render_to_json_response(d)
def add_relation(request):
feature1 = request.GET.get("feature1", None)
feature2 = request.GET.get("feature2", None)
relation = request.GET.get("relation", None)
if feature1 == None or feature2 == None or relation == None: #TODO: split up errors :/ -- not imp.
return render_to_json_response({'error': 'bad request'})
2011-08-31 21:51:56 -07:00
2011-09-01 08:53:22 +05:30
if not request.user.is_staff:
return render_to_json_response({'error': 'insufficient permissions error. try logging in again? are you staff / admin?'})
2011-09-01 09:19:46 +02:00
feature1 = get_object_or_404_json(Feature, pk=feature1)
feature2 = get_object_or_404_json(Feature, pk=feature2)
rel_obj = None
try:
rel_obj = Relationship.objects.get(feature1=feature1, feature2=feature2, relationship_type=relation)
2011-09-01 09:19:46 +02:00
except ObjectDoesNotExist:
rel_obj = Relationship(feature1=feature1, feature2=feature2, relationship_type=relation)
2011-09-01 09:19:46 +02:00
verb = "created"
if relation == "":
if rel_obj.id:
verb = "deleted"
rel_obj.delete()
if relation == "conflates":
feature2.is_primary = True
feature2.save()
else:
2011-09-01 09:19:46 +02:00
return render_to_json_response({'error': 'relation is already deleted'})
else:
rel_obj.save()
if relation == "conflates":
feature2.is_primary = False
feature2.save()
2011-09-01 09:19:46 +02:00
return render_to_json_response({'success': 'relation %s successfully.' % verb})