]> git.ipfire.org Git - thirdparty/python-fints.git/commitdiff
Add forgotten file
authorHenryk Plötz <henryk@ploetzli.ch>
Mon, 10 Sep 2018 08:50:15 +0000 (10:50 +0200)
committerRaphael Michel <mail@raphaelmichel.de>
Mon, 3 Dec 2018 18:34:29 +0000 (19:34 +0100)
fints/segments/base.py [new file with mode: 0644]

diff --git a/fints/segments/base.py b/fints/segments/base.py
new file mode 100644 (file)
index 0000000..cc0bb74
--- /dev/null
@@ -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")