123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- from __future__ import absolute_import
- # Copyright (c) 2010-2019 openpyxl
- """
- Generic serialisable classes
- """
- from .base import (
- Convertible,
- Bool,
- Descriptor,
- NoneSet,
- MinMax,
- Set,
- Float,
- Integer,
- String,
- Text,
- )
- from .sequence import Sequence
- from openpyxl.compat import safe_string
- from openpyxl.xml.functions import Element, localname, whitespace
- class Nested(Descriptor):
- nested = True
- attribute = "val"
- def __set__(self, instance, value):
- if hasattr(value, "tag"):
- tag = localname(value)
- if tag != self.name:
- raise ValueError("Tag does not match attribute")
- value = self.from_tree(value)
- super(Nested, self).__set__(instance, value)
- def from_tree(self, node):
- return node.get(self.attribute)
- def to_tree(self, tagname=None, value=None, namespace=None):
- namespace = getattr(self, "namespace", namespace)
- if value is not None:
- if namespace is not None:
- tagname = "{%s}%s" % (namespace, tagname)
- value = safe_string(value)
- return Element(tagname, {self.attribute:value})
- class NestedValue(Nested, Convertible):
- """
- Nested tag storing the value on the 'val' attribute
- """
- pass
- class NestedText(NestedValue):
- """
- Represents any nested tag with the value as the contents of the tag
- """
- def from_tree(self, node):
- return node.text
- def to_tree(self, tagname=None, value=None, namespace=None):
- namespace = getattr(self, "namespace", namespace)
- if value is not None:
- if namespace is not None:
- tagname = "{%s}%s" % (namespace, tagname)
- el = Element(tagname)
- el.text = safe_string(value)
- whitespace(el)
- return el
- class NestedFloat(NestedValue, Float):
- pass
- class NestedInteger(NestedValue, Integer):
- pass
- class NestedString(NestedValue, String):
- pass
- class NestedBool(NestedValue, Bool):
- def from_tree(self, node):
- return node.get("val", True)
- class NestedNoneSet(Nested, NoneSet):
- pass
- class NestedSet(Nested, Set):
- pass
- class NestedMinMax(Nested, MinMax):
- pass
- class EmptyTag(Nested, Bool):
- """
- Boolean if a tag exists or not.
- """
- def from_tree(self, node):
- return True
- def to_tree(self, tagname=None, value=None, namespace=None):
- if value:
- namespace = getattr(self, "namespace", namespace)
- if namespace is not None:
- tagname = "{%s}%s" % (namespace, tagname)
- return Element(tagname)
|