162 lines
5.0 KiB
Python

# -*- coding: utf-8 -*-
"""
***************************************************************************
layer.py
---------------------
Date : November 2012
Copyright : (C) 2012 by Victor Olaya
Email : volayaf at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************
"""
__author__ = 'Victor Olaya'
__date__ = 'November 2012'
__copyright__ = '(C) 2012, Victor Olaya'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'
from style import Style
from support import ResourceInfo, \
xml_property, write_bool, url
class _attribution(object):
def __init__(self, title, width, height):
self.title = title
self.width = width
self.height = height
def _read_attribution(node):
title = node.find('title')
width = node.find('logoWidth')
height = node.find('logoHeight')
if title is not None:
title = title.text
if width is not None:
width = width.text
if height is not None:
height = height.text
return _attribution(title, width, height)
def _write_attribution(builder, attr):
builder.start('attribution', dict())
if attr.title is not None:
builder.start('title', dict())
builder.data(attr.title)
builder.end('title')
if attr.width is not None:
builder.start('logoWidth', dict())
builder.data(attr.width)
builder.end('logoWidth')
if attr.height is not None:
builder.start('logoHeight', dict())
builder.data(attr.height)
builder.end('logoHeight')
builder.end('attribution')
def _write_default_style(builder, name):
builder.start('defaultStyle', dict())
if name is not None:
builder.start('name', dict())
builder.data(name)
builder.end('name')
builder.end('defaultStyle')
def _write_alternate_styles(builder, styles):
builder.start('styles', dict())
for s in styles:
builder.start('style', dict())
builder.start('name', dict())
builder.data(s.name)
builder.end('name')
builder.end('style')
builder.end('styles')
class Layer(ResourceInfo):
def __init__(self, catalog, name):
super(Layer, self).__init__()
self.catalog = catalog
self.name = name
resource_type = 'layer'
save_method = 'PUT'
@property
def href(self):
return url(self.catalog.service_url, ['layers', self.name + '.xml'])
@property
def resource(self):
if self.dom is None:
self.fetch()
name = self.dom.find('resource/name').text
return self.catalog.get_resource(name)
def _get_default_style(self):
if 'default_style' in self.dirty:
return self.dirty['default_style']
if self.dom is None:
self.fetch()
name = self.dom.find('defaultStyle/name')
# Aborted data uploads can result in no default style
if name is not None:
return self.catalog.get_style(name.text)
else:
return None
def _set_default_style(self, style):
if isinstance(style, Style):
style = style.name
self.dirty['default_style'] = style
def _get_alternate_styles(self):
if 'alternate_styles' in self.dirty:
return self.dirty['alternate_styles']
if self.dom is None:
self.fetch()
styles = self.dom.findall('styles/style/name')
return [Style(self.catalog, s.text) for s in styles]
def _set_alternate_styles(self, styles):
self.dirty['alternate_styles'] = styles
default_style = property(_get_default_style, _set_default_style)
styles = property(_get_alternate_styles, _set_alternate_styles)
attribution_object = xml_property('attribution', _read_attribution)
enabled = xml_property('enabled', lambda x: x.text == 'true')
def _get_attr_text(self):
return self.attribution_object.title
def _set_attr_text(self, text):
self.dirty['attribution'] = _attribution(text,
self.attribution_object.width, self.attribution_object.height)
assert self.attribution_object.title == text
attribution = property(_get_attr_text, _set_attr_text)
writers = dict(attribution=_write_attribution, enabled=write_bool('enabled'
), default_style=_write_default_style,
alternate_styles=_write_alternate_styles)