118 lines
3.9 KiB
Python
118 lines
3.9 KiB
Python
# Create your views here.
|
|
from django.shortcuts import render_to_response, get_object_or_404
|
|
from ox.django.shortcuts import render_to_json_response, get_object_or_404_json
|
|
from django.template import RequestContext
|
|
from models import Feature, FeatureType, AuthorityRecord
|
|
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):
|
|
search_term = request.GET.get("q", "")
|
|
threshold = float(request.GET.get("threshold", '0.5'))
|
|
bbox = request.GET.get("bbox", False)
|
|
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))
|
|
|
|
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
|
|
return render_to_json_response({'error': 'bbox must be in the form: minx,miny,maxx,maxy'})
|
|
|
|
if not bbox and not search_term:
|
|
return render_to_json_response({'error': 'must supply either a valid `bbox` or a `search` parameter'})
|
|
|
|
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]
|
|
|
|
d = {
|
|
'type': 'FeatureCollection',
|
|
'results': total_results,
|
|
'current_page': page,
|
|
'pages': num_pages,
|
|
'features': features
|
|
}
|
|
return render_to_json_response(d)
|
|
|
|
'''
|
|
This function will be removed. No need for this page.
|
|
'''
|
|
def search_related(request):
|
|
id = request.GET.get("id", "0")
|
|
feature = get_object_or_404(Feature, pk=id)
|
|
similar_features = feature.similar_features()
|
|
d = []
|
|
for s in similar_features:
|
|
d.append({
|
|
'id': s.id,
|
|
'feature_type': FeatureType.objects.get(pk=s.feature_type_id),
|
|
'preferred_name': s.preferred_name,
|
|
'similarity': s.similarity,
|
|
'distance': s.distance
|
|
})
|
|
|
|
return render_to_response("search_related.html", {
|
|
'feature': feature,
|
|
'similar_features': d
|
|
})
|
|
|
|
|
|
def search_related_json(request, id):
|
|
# id = request.GET.get("id", "0")
|
|
id = str(id)
|
|
feature = get_object_or_404_json(Feature, pk=id)
|
|
similar_features = feature.similar_features()
|
|
d = []
|
|
|
|
for s in similar_features:
|
|
f = Feature.objects.get(pk=s.id) # This seems inefficient - better to get something like time_frame_id in models method? TODO
|
|
if f.time_frame is not None:
|
|
time_frame = f.time_frame.description
|
|
else:
|
|
time_frame = ''
|
|
|
|
d.append({
|
|
'id': s.id,
|
|
'feature_type': 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
|
|
})
|
|
return render_to_json_response(d)
|
|
|
|
def auth_record_json(request):
|
|
id = request.GET.get("id", "0")
|
|
auth_record = get_object_or_404(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)
|
|
|
|
|