<filename>fitness/private/ezodf/variables.py
#!/usr/bin/env python
#coding:utf-8
# Purpose: variables and user_fields objects
# Created: 10.10.2014
# Copyright (C) 2014, <NAME>
# License: MIT license
from __future__ import unicode_literals, print_function, division
__author__ = "T0ha <<EMAIL>>"

from .xmlns import register_class, CN, wrap
from .base import GenericWrapper
from .compatibility import itermap, tostr


class Variables(GenericWrapper):  # {{{1

    def __init__(self, xmlnode=None):  # {{{2
        """docstring for __init__"""
        super(Variables, self).__init__(xmlnode)
        self.variables = {}
        for v in self:
            self.variables[v.name] = v

    def __contains__(self, key):  # {{{2
        """docstring for __contains__"""
        return key in self.variables

    def __getitem__(self, index):  # {{{2
        if index in self.variables:
            return self.variables[index]
        else:
            return self.get_child(index)

    def __setitem__(self, index, value):  # {{{2
        if index in self.variables:
            self.variables[index].value = value
        else:
            return self.set_child(index, value)


@register_class
class SimpleVariables(Variables):  # {{{1
    """Simple variables dict-like container"""
    TAG = CN('text:variable-decls')


@register_class
class UserFields(Variables):  # {{{1
    TAG = CN('text:user-field-decls')


class Variable(GenericWrapper):  # {{{1

    def __init__(self, xmlnode=None):  # {{{2
        """docstring for __init__"""
        super(Variable, self).__init__(xmlnode)
        self.name = self.xmlnode.get(CN('text:name'))

    @property
    def instances(self):  # {{{2
        vs = self.get_xmlroot().findall(".//%s[@%s='%s']" %
                                                      (CN('text:variable-set'),
                                                       CN('text:name'),
                                                       self.name))
        vg = self.get_xmlroot().findall(".//%s[@%s='%s']" %
                                                      (CN('text:variable-get'),
                                                       CN('text:name'),
                                                       self.name))
        vi = self.get_xmlroot().findall(".//%s[@%s='%s']" %
                                                      (CN('text:variable-input'),
                                                       CN('text:name'),
                                                       self.name))
        return itermap(wrap, vs + vg + vi)

    @property
    def type(self):  # {{{2
        """Gets type of variable"""
        return self.get_attr(CN('office:value-type'), 'string')

    @type.setter
    def type(self, t):  # {{{2
        """Sets type of variable"""
        self.set_attr(CN('office:value-type'), tostr(t))
        for instance in self.instances:
            instance.type = t



@register_class
class SimpleVariable(Variable):  # {{{1
    TAG = CN('text:variable-decl')

    @property
    def value(self):  # {{{2
        """
        Get variable value
        FIXME: (it's assumed that all instances have the same value)
        """
        return list(self.instances)[0].value

    @value.setter
    def value(self, v):  # {{{2
        """
        Set variable value
        """
        vtype = type(v)

        for instance in self.instances:
            instance.value = v

        if vtype == bool:
            self.type = 'boolean'
        elif vtype == int or vtype == float:
            self.type = 'float'
        else:
            self.type = 'string'


@register_class
class UserField(Variable):  # {{{1
    TAG = CN('text:user-field-decl')

    @property
    def value(self):  # {{{2
        """
        Get user-field value
        FIXME: (it's assumed that all instances have the same value)
        """

        if self.type == 'boolean':
            return self.get_bool_attr(CN('office:boolean-value'))
        elif self.type == 'string':
            return self.get_attr(CN('office:string-value'))
        return float(self.get_attr(CN('office:value')))

    @value.setter
    def value(self, v):  # {{{2
        """
        Set user-field value
        """
        vtype = type(v)

        for instance in self.instances:
            instance.value = v

        if vtype == bool:
            self.type = 'boolean'
            self.set_bool_attr(CN('office:boolean-value'), v)
        elif vtype == int or vtype == float:
            self.set_attr(CN('office:value'), v)
            self.type = 'float'
        else:
            self.set_attr(CN('office:string-value'), v)
            self.type = 'string'


class SimpleVariableInstance(GenericWrapper):  # {{{1

    def __init__(self, xmlnode=None):  # {{{2
        super(SimpleVariableInstance, self).__init__(xmlnode)
        self.name = self.xmlnode.get(CN('text:name'))

    @property
    def value(self):  # {{{2
        """Gets instavce value"""
        if self.type == 'string':
            return self.text
        elif self.type == 'boolean':
            return self.text == 'true'
        elif self.type == 'float':
            return float(self.text)
        else:
            return self.text

    @value.setter
    def value(self, v):  # {{{2
        """Sets instavce value"""

        vtype = type(v)
        self.text = tostr(v)
        if vtype == bool:
            self.type = 'boolean'
        elif vtype == int or vtype == float:
            self.type = 'float'
        else:
            self.type = 'string'

    @property
    def type(self):  # {{{2
        """Gets type of variable"""
        return self.get_attr(CN('office:value-type'), 'string')

    @type.setter
    def type(self, t):  # {{{2
        """Sets type of variable"""
        self.set_attr(CN('office:value-type'), tostr(t))


@register_class
class SimpleVariableSet(SimpleVariableInstance):  # {{{1
    TAG = CN('text:variable-set')


@register_class
class SimpleVariableGet(SimpleVariableInstance):  # {{{1
    TAG = CN('text:variable-get')


@register_class
class SimpleVariableInput(SimpleVariableInstance):  # {{{1
    TAG = CN('text:variable-input')


class UserFieldInstance(GenericWrapper):  # {{{1

    def __init__(self, xmlnode=None):  # {{{2
        super(UserFieldInstance, self).__init__(xmlnode)
        self.name = self.xmlnode.get(CN('text:name'))

    @property
    def value(self):  # {{{2
        """Gets instavce value"""
        if self.type == 'string':
            return self.text
        elif self.type == 'boolean':
            return self.text == 'true'
        elif self.type == 'float':
            return float(self.text)
        else:
            return self.text

    @value.setter
    def value(self, v):  # {{{2
        """Sets instavce value"""

        vtype = type(v)
        self.text = tostr(v)
        if vtype == bool:
            self.type = 'boolean'
        elif vtype == int or vtype == float:
            self.type = 'float'
        else:
            self.type = 'string'

    @property
    def type(self):  # {{{2
        """Gets type of user-field"""
        return self.get_attr(CN('office:value-type'), 'string')

    @type.setter
    def type(self, t):  # {{{2
        """Sets type of user-field"""
        self.set_attr(CN('office:value-type'), tostr(t))


@register_class
class UserFieldSet(SimpleVariableInstance):  # {{{1
    TAG = CN('text:user-field-set')


@register_class
class UserFieldGet(SimpleVariableInstance):  # {{{1
    TAG = CN('text:user-field-get')


@register_class
class UserFieldInput(SimpleVariableInstance):  # {{{1
    TAG = CN('text:user-field-input')

<filename>fitness/private/ezodf/variables.py
#!/usr/bin/env python
#coding:utf-8
# Purpose: variables and user_fields objects
# Created: 10.10.2014
# Copyright (C) 2014, <NAME>
# License: MIT license
from __future__ import unicode_literals, print_function, division
__author__ = "T0ha <<EMAIL>>"

from .xmlns import register_class, CN, wrap
from .base import GenericWrapper
from .compatibility import itermap, tostr


class Variables(GenericWrapper):  # {{{1

    def __init__(self, xmlnode=None):  # {{{2
        """docstring for __init__"""
        super(Variables, self).__init__(xmlnode)
        self.variables = {}
        for v in self:
            self.variables[v.name] = v

    def __contains__(self, key):  # {{{2
        """docstring for __contains__"""
        return key in self.variables

    def __getitem__(self, index):  # {{{2
        if index in self.variables:
            return self.variables[index]
        else:
            return self.get_child(index)

    def __setitem__(self, index, value):  # {{{2
        if index in self.variables:
            self.variables[index].value = value
        else:
            return self.set_child(index, value)


@register_class
class SimpleVariables(Variables):  # {{{1
    """Simple variables dict-like container"""
    TAG = CN('text:variable-decls')


@register_class
class UserFields(Variables):  # {{{1
    TAG = CN('text:user-field-decls')


class Variable(GenericWrapper):  # {{{1

    def __init__(self, xmlnode=None):  # {{{2
        """docstring for __init__"""
        super(Variable, self).__init__(xmlnode)
        self.name = self.xmlnode.get(CN('text:name'))

    @property
    def instances(self):  # {{{2
        vs = self.get_xmlroot().findall(".//%s[@%s='%s']" %
                                                      (CN('text:variable-set'),
                                                       CN('text:name'),
                                                       self.name))
        vg = self.get_xmlroot().findall(".//%s[@%s='%s']" %
                                                      (CN('text:variable-get'),
                                                       CN('text:name'),
                                                       self.name))
        vi = self.get_xmlroot().findall(".//%s[@%s='%s']" %
                                                      (CN('text:variable-input'),
                                                       CN('text:name'),
                                                       self.name))
        return itermap(wrap, vs + vg + vi)

    @property
    def type(self):  # {{{2
        """Gets type of variable"""
        return self.get_attr(CN('office:value-type'), 'string')

    @type.setter
    def type(self, t):  # {{{2
        """Sets type of variable"""
        self.set_attr(CN('office:value-type'), tostr(t))
        for instance in self.instances:
            instance.type = t



@register_class
class SimpleVariable(Variable):  # {{{1
    TAG = CN('text:variable-decl')

    @property
    def value(self):  # {{{2
        """
        Get variable value
        FIXME: (it's assumed that all instances have the same value)
        """
        return list(self.instances)[0].value

    @value.setter
    def value(self, v):  # {{{2
        """
        Set variable value
        """
        vtype = type(v)

        for instance in self.instances:
            instance.value = v

        if vtype == bool:
            self.type = 'boolean'
        elif vtype == int or vtype == float:
            self.type = 'float'
        else:
            self.type = 'string'


@register_class
class UserField(Variable):  # {{{1
    TAG = CN('text:user-field-decl')

    @property
    def value(self):  # {{{2
        """
        Get user-field value
        FIXME: (it's assumed that all instances have the same value)
        """

        if self.type == 'boolean':
            return self.get_bool_attr(CN('office:boolean-value'))
        elif self.type == 'string':
            return self.get_attr(CN('office:string-value'))
        return float(self.get_attr(CN('office:value')))

    @value.setter
    def value(self, v):  # {{{2
        """
        Set user-field value
        """
        vtype = type(v)

        for instance in self.instances:
            instance.value = v

        if vtype == bool:
            self.type = 'boolean'
            self.set_bool_attr(CN('office:boolean-value'), v)
        elif vtype == int or vtype == float:
            self.set_attr(CN('office:value'), v)
            self.type = 'float'
        else:
            self.set_attr(CN('office:string-value'), v)
            self.type = 'string'


class SimpleVariableInstance(GenericWrapper):  # {{{1

    def __init__(self, xmlnode=None):  # {{{2
        super(SimpleVariableInstance, self).__init__(xmlnode)
        self.name = self.xmlnode.get(CN('text:name'))

    @property
    def value(self):  # {{{2
        """Gets instavce value"""
        if self.type == 'string':
            return self.text
        elif self.type == 'boolean':
            return self.text == 'true'
        elif self.type == 'float':
            return float(self.text)
        else:
            return self.text

    @value.setter
    def value(self, v):  # {{{2
        """Sets instavce value"""

        vtype = type(v)
        self.text = tostr(v)
        if vtype == bool:
            self.type = 'boolean'
        elif vtype == int or vtype == float:
            self.type = 'float'
        else:
            self.type = 'string'

    @property
    def type(self):  # {{{2
        """Gets type of variable"""
        return self.get_attr(CN('office:value-type'), 'string')

    @type.setter
    def type(self, t):  # {{{2
        """Sets type of variable"""
        self.set_attr(CN('office:value-type'), tostr(t))


@register_class
class SimpleVariableSet(SimpleVariableInstance):  # {{{1
    TAG = CN('text:variable-set')


@register_class
class SimpleVariableGet(SimpleVariableInstance):  # {{{1
    TAG = CN('text:variable-get')


@register_class
class SimpleVariableInput(SimpleVariableInstance):  # {{{1
    TAG = CN('text:variable-input')


class UserFieldInstance(GenericWrapper):  # {{{1

    def __init__(self, xmlnode=None):  # {{{2
        super(UserFieldInstance, self).__init__(xmlnode)
        self.name = self.xmlnode.get(CN('text:name'))

    @property
    def value(self):  # {{{2
        """Gets instavce value"""
        if self.type == 'string':
            return self.text
        elif self.type == 'boolean':
            return self.text == 'true'
        elif self.type == 'float':
            return float(self.text)
        else:
            return self.text

    @value.setter
    def value(self, v):  # {{{2
        """Sets instavce value"""

        vtype = type(v)
        self.text = tostr(v)
        if vtype == bool:
            self.type = 'boolean'
        elif vtype == int or vtype == float:
            self.type = 'float'
        else:
            self.type = 'string'

    @property
    def type(self):  # {{{2
        """Gets type of user-field"""
        return self.get_attr(CN('office:value-type'), 'string')

    @type.setter
    def type(self, t):  # {{{2
        """Sets type of user-field"""
        self.set_attr(CN('office:value-type'), tostr(t))


@register_class
class UserFieldSet(SimpleVariableInstance):  # {{{1
    TAG = CN('text:user-field-set')


@register_class
class UserFieldGet(SimpleVariableInstance):  # {{{1
    TAG = CN('text:user-field-get')


@register_class
class UserFieldInput(SimpleVariableInstance):  # {{{1
    TAG = CN('text:user-field-input')

#!/usr/bin/env python #coding:utf-8 # Purpose: variables and user_fields objects # Created: 10.10.2014 # Copyright (C) 2014, <NAME> # License: MIT license # {{{1 # {{{2 docstring for __init__ # {{{2 docstring for __contains__ # {{{2 # {{{2 # {{{1 Simple variables dict-like container # {{{1 # {{{1 # {{{2 docstring for __init__ # {{{2 # {{{2 Gets type of variable # {{{2 Sets type of variable # {{{1 # {{{2 Get variable value         FIXME: (it's assumed that all instances have the same value) # {{{2 Set variable value # {{{1 # {{{2 Get user-field value         FIXME: (it's assumed that all instances have the same value) # {{{2 Set user-field value # {{{1 # {{{2 # {{{2 Gets instavce value # {{{2 Sets instavce value # {{{2 Gets type of variable # {{{2 Sets type of variable # {{{1 # {{{1 # {{{1 # {{{1 # {{{2 # {{{2 Gets instavce value # {{{2 Sets instavce value # {{{2 Gets type of user-field # {{{2 Sets type of user-field # {{{1 # {{{1 # {{{1