Пример #1
0
    def __call__(self, environ, start_response):
        # we need to seed the query object with an area by translating
        # the area name to an area id

        areas = {
            'ices-rectangles': 'ir',
            'countries': 'co',
            'charting-progress': 'cp',
            'sea-areas': 'sa'
        }

        area = environ['selector.vars']['area']
        name = environ['selector.vars']['name']

        try:
            area_type = areas[area]
        except KeyError:
            raise HTTPError('404 Not Found',
                            'The area is not recognised: %s' % area)

        areas = get_areas(environ)
        aid = areas.getAreaId(name, area_type)
        if not aid:
            raise HTTPError('404 Not Found',
                            'The area name is not recognised: %s' % name)

        q = get_query(environ)
        q.setArea(aid)
        set_query(q, environ)

        # delegate to the result app
        return self.app(environ, start_response)
Пример #2
0
    def __call__(self, environ, start_response):
        from os.path import splitext

        self.prepareSOAP(environ)
        gid, fmt = self.gid, self.fmt
        response = self.request()
        if not response:
            raise HTTPError('404 Not Found',
                            'The metadata record does not exist: %s' % gid)

        document = self.obfuscate_emails(response.xml)
        if not document:
            raise HTTPError(
                '404 Not Found',
                'The metadata format does not contain any data: %s' % fmt)

        # Check if the client needs a new version
        headers = []
        date = response.date
        if date:
            etag = check_etag(environ, date)
            headers.extend([('Etag', etag),
                            ('Cache-Control', 'no-cache, must-revalidate')])

        filename = gid
        if splitext(filename)[1] != '.xml':
            filename += '.xml'

        headers.extend([('Content-disposition',
                         'attachment; filename="%s"' % filename),
                        ('Content-Type', 'application/xml')])

        start_response('200 OK', headers)
        return [document]
Пример #3
0
    def __call__(self, environ, start_response):
        """
        Call an app associated with a template
        """
        from medin.templates import get_template_name

        template = get_template_name(environ)
        if template is None:
            template = self.default_template

        if not self.templates:
            raise RuntimeError('No template applications have been added')

        try:
            app = self.templates[template]
        except KeyError:
            from medin.templates import set_template_name
            # set the template name so this error can't become
            # recursive which is the case if this code is used in an
            # error handler
            if self.default_template in self.templates:
                # use the default template
                set_template_name(environ, self.default_template)
            else:
                # use any template
                set_template_name(environ, self.templates.keys()[0])
            raise HTTPError('404 Not Found',
                            'The requested template does not exist')

        return app(environ, start_response)
Пример #4
0
    def __call__(self, environ, start_response):
        import os.path
        import medin.spatial

        self.prepareSOAP(environ)
        parser = self.request()
        if not parser:
            raise HTTPError(
                '404 Not Found', 'The metadata record does not exist: %s' %
                environ['selector.vars']['gid'])

        # Check if the client needs a new version
        headers = []
        date = get_metadata_date(environ, parser)
        if date:
            etag = check_etag(environ, date)
            headers.extend([('Etag', etag),
                            ('Cache-Control', 'no-cache, must-revalidate')])

        bboxes = parser.bboxes()
        if not bboxes:
            raise HTTPError(
                '404 Not Found',
                'The metadata record does not have a geographic bounding box')

        # ensure the background raster datasource has been created
        template_lookup = TemplateLookup(environ)
        lookup = template_lookup.lookup()
        rasterpath = background_raster(lookup, environ)

        # create the mapfile from its template
        mappath = os.path.join('config', 'metadata-extent.xml')
        template = lookup.get_template(mappath)
        mapfile = template.render(root_dir=environ.root)

        # create the image
        image = medin.spatial.metadata_image(bboxes, mapfile)

        # serialise the image
        bytes = image.tostring('png')

        headers.append(('Content-Type', 'image/png'))

        start_response('200 OK', headers)
        return [bytes]
Пример #5
0
def http404(environ, start_response):
    """
    Raises a HTTP 404 Not Found exception when called

    The actual exception should be handled elsewhere.
    """
    msg = 'The resource you specified could not be found: %s' % environ.request_uri(
    )
    raise HTTPError('404 Not Found', msg)
Пример #6
0
def proxy(environ, start_response):
    from medin.query import GETParams

    params = GETParams(environ.get('QUERY_STRING', ''))
    try:
        url = params['url'][0]
    except KeyError:
        url = ''

    valid_proxies = ('http://www.dassh.ac.uk:8081/geoserver/wfs', )
    if not url.startswith(valid_proxies):
        raise HTTPError('403 Forbidden', 'The url cannot be proxied: %s' % url)

    import urllib2
    response = urllib2.urlopen(url, timeout=5)
    try:
        response = urllib2.urlopen(url, timeout=5)
    except urllib2.HTTPError, e:
        raise HTTPError('%d Error' % e.getcode(), str(e))
Пример #7
0
    def prepareSOAP(self, environ):
        gid = environ['selector.vars']['gid']  # the global metadata identifier
        fmt = environ['selector.vars']['format']  # the requested format

        if fmt not in self.request.getMetadataFormats(
                environ['logging.logger']):
            raise HTTPError('404 Not Found',
                            'The metadata format is not supported: %s' % fmt)

        self.gid = gid
        self.fmt = fmt
        return self.request.prepareCaller(environ['logging.logger'], gid, fmt)
Пример #8
0
    def getConfig(self, environ):
        if self.config:
            return self.config

        import os.path
        from ConfigParser import SafeConfigParser

        ini_file = os.path.join(environ.root, 'etc', self.name)
        try:
            fp = open(ini_file, 'r')
        except Exception, e:
            raise HTTPError('500 Configuration Error',
                            'the INI file could not be read: %s' % str(e))
Пример #9
0
    def __call__(self, environ, start_response):
        try:
            fmt = environ['selector.vars']['format']
        except KeyError:
            app = self.default
        else:
            if fmt is not None:
                try:
                    app = self.formats[fmt]
                except KeyError:
                    raise HTTPError('404 Not Found',
                                    'The format is not supported: %s' % fmt)
            else:
                app = self.default

        return app(environ, start_response)
Пример #10
0
    def setup(self, environ, etag_data=''):

        self.prepareSOAP(environ)
        parser = self.request()
        if not parser:
            raise HTTPError(
                '404 Not Found', 'The metadata record does not exist: %s' %
                environ['selector.vars']['gid'])

        # Check if the client needs a new version
        headers = []
        if parser:
            # check the etag, adding any extra data to the etag
            date = get_metadata_date(environ, parser)
            if date:
                etag = check_etag(environ, date + etag_data)
                headers.extend([('Etag', etag),
                                ('Cache-Control', 'no-cache, must-revalidate')
                                ])

        return parser, headers
Пример #11
0
def get_bbox(environ, start_response):
    from json import dumps as tojson
    from medin.spatial import Areas

    aid = environ['selector.vars']['id']  # the area ID

    # Check if the client needs a new version
    etag = check_etag(environ, aid)

    bbox = Areas(get_db(environ)).getBBOX(aid)
    if not bbox:
        raise HTTPError('404 Not Found',
                        'The area id does not exist: %s' % aid)

    json = tojson(bbox)

    headers = [('Content-Type', 'application/json'), ('Etag', etag),
               ('Cache-Control', 'max-age=3600, must-revalidate')]

    start_response('200 OK', headers)
    return [json]
Пример #12
0
    def __call__(self, environ, start_response):
        from cStringIO import StringIO
        from medin.metadata import metadata2csv

        self.prepareSOAP(environ)
        gid = self.gid
        parser = self.request()
        if not parser:
            raise HTTPError('404 Not Found',
                            'The metadata record does not exist: %s' % gid)

        # Check if the client needs a new version
        headers = []
        date = get_metadata_date(environ, parser)
        if date:
            etag = check_etag(environ, date)
            headers.extend([('Etag', etag),
                            ('Cache-Control', 'no-cache, must-revalidate')])

        metadata = parser.parse()

        buf = StringIO()
        metadata2csv(metadata, buf)
        buf.seek(0)  # point to the start of the buffer

        if metadata.unique_id:
            filename = metadata.unique_id + '.csv'
        else:
            filename = gid + '.csv'

        headers.extend([('Content-disposition',
                         'attachment; filename="%s"' % filename),
                        ('Content-Type', 'application/vnd.ms-excel')])

        start_response('200 OK', headers)
        return buf
Пример #13
0
        raise HTTPError('403 Forbidden', 'The url cannot be proxied: %s' % url)

    import urllib2
    response = urllib2.urlopen(url, timeout=5)
    try:
        response = urllib2.urlopen(url, timeout=5)
    except urllib2.HTTPError, e:
        raise HTTPError('%d Error' % e.getcode(), str(e))
    except urllib2.URLError, e:
        try:
            status, msg = e.reason
        except ValueError:
            msg = str(e.reason)
            status = 500

        raise HTTPError('%d Error' % status, msg)

    # remove hop-by-hop headers (as defined at http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html)
    for header in ('Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization',
                   'TE', 'Trailers', 'Transfer-Encoding', 'Upgrade',
                   'Connection', 'Server'):
        del response.headers[header]

    headers = response.headers.items()
    start_response('%s OK' % response.getcode(), headers)
    return response


class ErrorRenderer(MakoApp):
    """
    A view to render an exception to the user interface.