The license.txt file has been replaced with LICENSE for quite a while now. INAL but it didn't seem accurate to say "hey, checkout license.txt although there's no such file". Apart from this, there were inconsistencies in the headers altogether...this change brings consistency.
94 lines
2.9 KiB
Python
94 lines
2.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright (c) 2020, Frappe Technologies and contributors
|
|
# License: MIT. See LICENSE
|
|
|
|
import frappe
|
|
|
|
from pymysql import InternalError
|
|
|
|
|
|
@frappe.whitelist()
|
|
def get_coords(doctype, filters, type):
|
|
'''Get a geojson dict representing a doctype.'''
|
|
filters_sql = get_coords_conditions(doctype, filters)[4:]
|
|
|
|
coords = None
|
|
if type == 'location_field':
|
|
coords = return_location(doctype, filters_sql)
|
|
elif type == 'coordinates':
|
|
coords = return_coordinates(doctype, filters_sql)
|
|
|
|
out = convert_to_geojson(type, coords)
|
|
return out
|
|
|
|
def convert_to_geojson(type, coords):
|
|
'''Converts GPS coordinates to geoJSON string.'''
|
|
geojson = {"type": "FeatureCollection", "features": None}
|
|
|
|
if type == 'location_field':
|
|
geojson['features'] = merge_location_features_in_one(coords)
|
|
elif type == 'coordinates':
|
|
geojson['features'] = create_gps_markers(coords)
|
|
|
|
return geojson
|
|
|
|
|
|
def merge_location_features_in_one(coords):
|
|
'''Merging all features from location field.'''
|
|
geojson_dict = []
|
|
for element in coords:
|
|
geojson_loc = frappe.parse_json(element['location'])
|
|
if not geojson_loc:
|
|
continue
|
|
for coord in geojson_loc['features']:
|
|
coord['properties']['name'] = element['name']
|
|
geojson_dict.append(coord.copy())
|
|
|
|
return geojson_dict
|
|
|
|
|
|
def create_gps_markers(coords):
|
|
'''Build Marker based on latitude and longitude.'''
|
|
geojson_dict = []
|
|
for i in coords:
|
|
node = {"type": "Feature", "properties": {}, "geometry": {"type": "Point", "coordinates": None}}
|
|
node['properties']['name'] = i.name
|
|
node['geometry']['coordinates'] = [i.latitude, i.longitude]
|
|
geojson_dict.append(node.copy())
|
|
|
|
return geojson_dict
|
|
|
|
|
|
def return_location(doctype, filters_sql):
|
|
'''Get name and location fields for Doctype.'''
|
|
if filters_sql:
|
|
try:
|
|
coords = frappe.db.sql('''SELECT name, location FROM `tab{}` WHERE {}'''.format(doctype, filters_sql), as_dict=True)
|
|
except InternalError:
|
|
frappe.msgprint(frappe._('This Doctype does not contain location fields'), raise_exception=True)
|
|
return
|
|
else:
|
|
coords = frappe.get_all(doctype, fields=['name', 'location'])
|
|
return coords
|
|
|
|
|
|
def return_coordinates(doctype, filters_sql):
|
|
'''Get name, latitude and longitude fields for Doctype.'''
|
|
if filters_sql:
|
|
try:
|
|
coords = frappe.db.sql('''SELECT name, latitude, longitude FROM `tab{}` WHERE {}'''.format(doctype, filters_sql), as_dict=True)
|
|
except InternalError:
|
|
frappe.msgprint(frappe._('This Doctype does not contain latitude and longitude fields'), raise_exception=True)
|
|
return
|
|
else:
|
|
coords = frappe.get_all(doctype, fields=['name', 'latitude', 'longitude'])
|
|
return coords
|
|
|
|
|
|
def get_coords_conditions(doctype, filters=None):
|
|
'''Returns SQL conditions with user permissions and filters for event queries.'''
|
|
from frappe.desk.reportview import get_filters_cond
|
|
if not frappe.has_permission(doctype):
|
|
frappe.throw(frappe._("Not Permitted"), frappe.PermissionError)
|
|
|
|
return get_filters_cond(doctype, filters, [], with_match_conditions=True)
|