Example #1
0
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')
Example #2
0
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
Example #3
0
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')
Example #4
0
    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))