def filterdata(request): """Handle filter requrest - using OGC WFS service The request body should look like: { 'layer': 'Places', 'maxfeatures': 1000, 'startindex': 0, 'bbox': [0, 1, 2, 3], 'filters': [{ 'attribute': 'NAME', 'value': 'Prague', 'operator': '=' }] } sent as HTTP POST request """ if request.method == 'POST': project = request.GET['PROJECT'] project = get_last_project_version(project) + '.qgs' url = settings.GISQUICK_MAPSERVER_URL params = {'MAP': abs_project_path(project)} mapserv = '{}?{}'.format(url, urllib.parse.urlencode(params)) filter_request = json.loads(request.body.decode('utf-8')) layer_name = filter_request['layer'] maxfeatures = startindex = bbox = filters = None if 'maxfeatures' in filter_request: maxfeatures = filter_request['maxfeatures'] if 'startindex' in filter_request: startindex = filter_request['startindex'] if 'bbox' in filter_request: bbox = filter_request['bbox'] if 'filters' in filter_request: filters = filter_request['filters'] result = webgisfilter(mapserv, layer_name, maxfeatures=maxfeatures, startindex=startindex, bbox=bbox, filters=filters) return HttpResponse(json.dumps(result), content_type="application/json") else: raise Exception('No inputs specified, use POST method')
def update_table_templates(request): params = json.loads(request.body.decode('utf-8')) project = params['project'] if request.method == 'POST' and project: ows_project = get_last_project_version(project) metafile = os.path.join(settings.GISQUICK_PROJECT_ROOT, ows_project+'.meta') with open(metafile, 'r+') as f: project = json.load(f) def inline_layers(layers, d={}): for layer in layers: if 'layers' in layer: inline_layers(layer['layers'], d) else: name = layer.get('serverName') or layer['name'] d[name] = layer return d layers = inline_layers(project['overlays']) # print('\n'.join(layers)) templates_dir = os.path.join(os.path.dirname(metafile), 'info_panel') if os.path.exists(templates_dir): # for lname in layers: # layer = layers[lname] # with open(os.path.join(templates_dir, 'general.html')) as temp: # template = temp.read() # layer['info_template'] = template for filename in filter(lambda f: f.endswith('.html'), os.listdir(templates_dir)): lname = os.path.splitext(filename)[0] if lname in layers: layer = layers[lname] with open(os.path.join(templates_dir, filename)) as temp: template = temp.read() layer['info_template'] = template else: logging.warn('Unknown Layer Template: %s', lname) else: # remove existing templates for layer in layers: if 'info_template' in layer: del layer['info_template'] with open(metafile, 'w') as f: json.dump(project, f, indent=2) # return JsonResponse({}) return HttpResponse(" ") raise Http404
def filterdata(request): """Handle filter requrest - using OGC WFS service The request body should look like: { 'layer': 'Places', 'maxfeatures': 1000, 'startindex': 0, 'bbox': [0, 1, 2, 3], 'filters': [{ 'attribute': 'NAME', 'value': 'Prague', 'operator': '=' }] } sent as HTTP POST request """ if request.method == 'POST': project = request.GET['PROJECT'] url = settings.GISLAB_WEB_MAPSERVER_URL params = { 'MAP': get_last_project_version(project) + '.qgs' } mapserv = '{}?{}'.format(url, urllib.parse.urlencode(params)) filter_request = json.loads(request.body.decode('utf-8')) layer_name = filter_request['layer'] maxfeatures = startindex = bbox = filters = None if 'maxfeatures' in filter_request: maxfeatures = filter_request['maxfeatures'] if 'startindex' in filter_request: startindex = filter_request['startindex'] if 'bbox' in filter_request: bbox = filter_request['bbox'] if 'filters' in filter_request: filters = filter_request['filters'] result = webgisfilter(mapserv, layer_name, maxfeatures=maxfeatures, startindex=startindex, bbox=bbox, filters=filters) return HttpResponse(json.dumps(result), content_type="application/json") else: raise Exception('No inputs specified, use POST method')
def handle(self, *args, **options): cache = Disk(base=os.path.join(settings.MEDIA_ROOT, 'cache')) for project_record in list(Project_registry.objects.all()): project = project_record.project project_hash = hashlib.md5(project.encode('utf-8')).hexdigest() project_cache_dir = os.path.join(cache.basedir, project_hash) last_publish = 0 last_project_version = get_last_project_version(project) if last_project_version and os.path.exists( os.path.join(settings.GISQUICK_PROJECT_ROOT, last_project_version + '.qgs')): version_pattern = re.compile(re.escape(project) + '_(\d{10})') match = version_pattern.match(last_project_version) if match: # timestamp from filename last_publish = int(match.group(1)) else: # timestamp from metadata metadata_filename = os.path.join( settings.GISQUICK_PROJECT_ROOT, last_project_version + '.meta') if os.path.exists(metadata_filename): try: metadata = MetadataParser(metadata_filename) last_publish = int(metadata.publish_date_unix) except: self.stderr.write( "Failed to load '{0}' project's metadata file: '{1}'" .format(project, metadata_filename)) if os.path.exists(project_cache_dir): project_publications = os.listdir(project_cache_dir) if project_publications: for publish_tag in project_publications: if int(publish_tag) != int(last_publish): publish_pretty = datetime.datetime.fromtimestamp( int(publish_tag)).strftime( "%d.%m.%Y %H:%M:%S") self.stdout.write( "Cleaning '{0}' project's publication '{1}' ({2})" .format(project, publish_tag, publish_pretty)) try: cache.delete_project_cache( project_hash, publish_tag) except: cache_dir = os.path.join( project_cache_dir, publish_tag) self.stderr.write( "Failed to delete '{0}' project's publication '{1}' ({2}): {3}" .format(project, publish_tag, publish_pretty, cache_dir)) else: # remove empty project's cache folder try: os.rmdir(project_cache_dir) except: pass else: # project was deleted, clean all existing publications self.stdout.write( "Cleaning cache of deleted project '{0}'".format(project)) try: cache.delete_project_cache(project_hash) project_record.delete() except: self.stderr.write( "Failed to delete '{0}' project's cache: {1}".format( project, project_cache_dir))