From 9795be6e870235a39cb7beca93d85407f983fd69 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Henryk=20Pl=C3=B6tz?= Date: Mon, 10 Sep 2018 10:50:15 +0200 Subject: [PATCH] Add forgotten file --- fints/segments/base.py | 69 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 fints/segments/base.py diff --git a/fints/segments/base.py b/fints/segments/base.py new file mode 100644 index 0000000..cc0bb74 --- /dev/null +++ b/fints/segments/base.py @@ -0,0 +1,69 @@ +import re + +from fints.fields import DataElementField, DataElementGroupField, IntCodeField +from fints.formals import SecurityClass, SegmentHeader +from fints.types import Container, ContainerMeta +from fints.utils import SubclassesMixin, classproperty + +TYPE_VERSION_RE = re.compile(r'^([A-Z]+)(\d+)$') + +class FinTS3SegmentMeta(ContainerMeta): + @staticmethod + def _check_fields_recursive(instance): + for name, field in instance._fields.items(): + if not isinstance(field, (DataElementField, DataElementGroupField)): + raise TypeError("{}={!r} is not DataElementField or DataElementGroupField".format(name, field)) + if isinstance(field, DataElementGroupField): + FinTS3SegmentMeta._check_fields_recursive(field.type) + + def __new__(cls, name, bases, classdict): + retval = super().__new__(cls, name, bases, classdict) + FinTS3SegmentMeta._check_fields_recursive(retval) + return retval + +class FinTS3Segment(Container, SubclassesMixin, metaclass=FinTS3SegmentMeta): + header = DataElementGroupField(type=SegmentHeader, _d="Segmentkopf") + + @classproperty + def TYPE(cls): + match = TYPE_VERSION_RE.match(cls.__name__) + if match: + return match.group(1) + + @classproperty + def VERSION(cls): + match = TYPE_VERSION_RE.match(cls.__name__) + if match: + return int( match.group(2) ) + + def __init__(self, *args, **kwargs): + if 'header' not in kwargs: + kwargs['header'] = SegmentHeader(self.TYPE, None, self.VERSION) + + args = (kwargs.pop('header'), ) + args + + return super().__init__(*args, **kwargs) + + @classmethod + def find_subclass(cls, segment): + h = SegmentHeader.naive_parse(segment[0]) + target_cls = None + + for possible_cls in cls._all_subclasses(): + if getattr(possible_cls, 'TYPE', None) == h.type and getattr(possible_cls, 'VERSION', None) == h.version: + target_cls = possible_cls + + if not target_cls: + target_cls = cls + + return target_cls + + +class ParameterSegment_22(FinTS3Segment): + max_number_tasks = DataElementField(type='num', max_length=3, _d="Maximale Anzahl Aufträge") + min_number_signatures = DataElementField(type='num', length=1, _d="Anzahl Signaturen mindestens") + +class ParameterSegment(FinTS3Segment): + max_number_tasks = DataElementField(type='num', max_length=3, _d="Maximale Anzahl Aufträge") + min_number_signatures = DataElementField(type='num', length=1, _d="Anzahl Signaturen mindestens") + security_class = IntCodeField(SecurityClass, length=1, _d="Sicherheitsklasse") -- 2.47.3