From: Henryk Plötz Date: Mon, 10 Sep 2018 08:50:15 +0000 (+0200) Subject: Add forgotten file X-Git-Tag: v2.0.0~1^2~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9795be6e870235a39cb7beca93d85407f983fd69;p=thirdparty%2Fpython-fints.git Add forgotten file --- 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")