]> git.ipfire.org Git - thirdparty/python-fints.git/commitdiff
More docs
authorHenryk Plötz <henryk@ploetzli.ch>
Thu, 16 Aug 2018 09:31:02 +0000 (11:31 +0200)
committerRaphael Michel <mail@raphaelmichel.de>
Mon, 3 Dec 2018 18:34:29 +0000 (19:34 +0100)
fints/fields.py
fints/formals.py
fints/segments/__init__.py
fints/types.py

index 62327089fd80ba93894269bea9394c3f5e6761ec..71901757189c953ccedca46a009021656e671efb 100644 (file)
@@ -237,11 +237,7 @@ class BooleanField(FixedLengthMixin, AlphanumericField):
         else:
             raise ValueError("Invalid value {!r} for BooleanField".format(value))
 
-class CodeField(AlphanumericField):
-    type = 'code'
-    _DOC_TYPE = str
-
-    ## FIXME: Not further implemented, might want to use Enums
+class CodeFieldMixin:
     # FIXME Need tests
 
     def __init__(self, enum=None, *args, **kwargs):
@@ -276,6 +272,15 @@ class CodeField(AlphanumericField):
                 retval = retval + addendum
         return retval
 
+class CodeField(CodeFieldMixin, AlphanumericField):
+    type = 'code'
+    _DOC_TYPE = str
+
+class IntCodeField(CodeFieldMixin, NumericField):
+    type = ''
+    _DOC_TYPE = int
+    _FORMAT_STRING = "{}"
+
 class CountryField(FixedLengthMixin, DigitsField):
     type = 'ctr'
     _FIXED_LENGTH = [3]
index 4f88bff70ce03d108a8a33e27ff7b4966c4f9488..19d2d28982503f5be4f8d08711761c5a7874a2f2 100644 (file)
@@ -318,3 +318,14 @@ class CompressionFunction(RepresentableEnum):
 class SecurityApplicationArea(RepresentableEnum):
     SHM = '1' #: Signaturkopf und HBCI-Nutzdaten
     SHT = '2' #: Von Signaturkopf bis Signaturabschluss
+
+class SecurityClass(RepresentableEnum):
+    NONE = 0 #: Kein Sicherheitsdienst erforderlich
+    AUTH = 1 #: Sicherheitsdienst 'Authentikation'
+    AUTH_ADV = 2 #: Sicherheitsdienst 'Authentikation' mit fortgeschrittener elektronischer Signatur, optionaler Zertifikatsprüfung
+    NON_REPUD = 3 #: Sicherheitsdienst 'Non-Repudiation' mit fortgeschrittener elektronischer Signatur, optionaler Zertifikatsprüfung
+    NON_REPUD_QUAL = 4 #: Sicherheitsdienst 'Non-Repudiation' mit fortgeschrittener bzw. qualifizierter elektronischer Signatur, zwingende Zertifikatsprüfung
+
+class UPDUsage(RepresentableEnum):
+    UPD_CONCLUSIVE = '0' #: Die nicht aufgeführten Geschäftsvorfälle sind gesperrt
+    UPD_INCONCLUSIVE = '1' #: Bei nicht aufgeführten Geschäftsvorfällen ist keine Aussage möglich, ob diese erlaubt oder gesperrt sind
index a9f70eb8eab94af188485006ce01167ccbad50c7..11e1d98957b8df3d51d36435bae462a847fcfed1 100644 (file)
@@ -10,9 +10,9 @@ from fints.formals import (
     SecurityDateTime, SecurityIdentificationDetails, SecurityProfile, SecurityRole,
     SegmentHeader, SegmentSequenceField, SignatureAlgorithm,
     SupportedHBCIVersions2, SupportedLanguages2, UserDefinedSignature,
-    CompressionFunction, SecurityApplicationArea,
+    CompressionFunction, SecurityApplicationArea, SecurityClass, UPDUsage
 )
-from fints.fields import CodeField
+from fints.fields import CodeField, IntCodeField
 from fints.utils import SubclassesMixin, classproperty
 
 TYPE_VERSION_RE = re.compile(r'^([A-Z]+)(\d+)$')
@@ -82,15 +82,16 @@ class FinTS3Segment(Container, SubclassesMixin, metaclass=FinTS3SegmentMeta):
         return target_cls
 
 class HNHBK3(FinTS3Segment):
-    message_size = DataElementField(type='dig', length=12)
-    hbci_version = DataElementField(type='num', max_length=3)
-    dialogue_id = DataElementField(type='id')
-    message_number = DataElementField(type='num', max_length=4)
-    reference_message = DataElementGroupField(type=ReferenceMessage, required=False)
+    "Nachrichtenkopf"
+    message_size = DataElementField(type='dig', length=12, _d="Größe der Nachricht (nach Verschlüsselung und Komprimierung)")
+    hbci_version = DataElementField(type='num', max_length=3, _d="HBCI-Version")
+    dialogue_id = DataElementField(type='id', _d="Dialog-ID")
+    message_number = DataElementField(type='num', max_length=4, _d="Nachrichtennummer")
+    reference_message = DataElementGroupField(type=ReferenceMessage, required=False, _d="Bezugsnachricht")
 
 class HNHBS1(FinTS3Segment):
     "Nachrichtenabschluss"
-    message_number = DataElementField(type='num', max_length=4)
+    message_number = DataElementField(type='num', max_length=4, _d="Nachrichtennummer")
 
 
 class HNVSD1(FinTS3Segment):
@@ -131,41 +132,46 @@ class HNSHA2(FinTS3Segment):
     user_defined_signature = DataElementGroupField(type=UserDefinedSignature, required=False, _d="Benutzerdefinierte Signatur")
 
 class HIRMG2(FinTS3Segment):
-    responses = DataElementGroupField(type=Response, min_count=1, max_count=99)
+    "Rückmeldungen zur Gesamtnachricht"
+    responses = DataElementGroupField(type=Response, min_count=1, max_count=99, _d="Rückmeldung")
 
 class HIRMS2(FinTS3Segment):
-    responses = DataElementGroupField(type=Response, min_count=1, max_count=99)
+    "Rückmeldungen zu Segmenten"
+    responses = DataElementGroupField(type=Response, min_count=1, max_count=99, _d="Rückmeldung")
 
 class HIUPA4(FinTS3Segment):
-    user_identifier = DataElementField(type='id')
-    upd_version = DataElementField(type='num', max_length=3)
-    upd_usage = DataElementField(type='code', length=1)
-    username = DataElementField(type='an', max_length=35, required=False)
-    extension = DataElementField(type='an', max_length=2048, required=False)
+    "Userparameter allgemein"
+    user_identifier = DataElementField(type='id', _d="Benutzerkennung")
+    upd_version = DataElementField(type='num', max_length=3, _d="UPD-Version")
+    upd_usage = CodeField(UPDUsage, length=1, _d="UPD-Verwendung")
+    username = DataElementField(type='an', max_length=35, required=False, _d="Benutzername")
+    extension = DataElementField(type='an', max_length=2048, required=False, _d="Erweiterung, allgemein")
 
 class HIUPD6(FinTS3Segment):
-    account_information = DataElementGroupField(type=AccountInformation, required=False)
-    iban = DataElementField(type='an', max_length=34)
-    customer_id = DataElementField(type='id')
-    account_type = DataElementField(type='num', max_length=2)
-    account_currency = DataElementField(type='cur')
-    name_account_owner_1 = DataElementField(type='an', max_length=27)
-    name_account_owner_2 = DataElementField(type='an', max_length=27, required=False)
-    account_product_name = DataElementField(type='an', max_length=30, required=False)
-    account_limit = DataElementGroupField(type=AccountLimit, required=False)
-    allowed_transactions = DataElementGroupField(type=AllowedTransaction, max_count=999, required=False)
-    extension = DataElementField(type='an', max_length=2048, required=False)
+    "Kontoinformationen"
+    account_information = DataElementGroupField(type=AccountInformation, required=False, _d="Kontoverbindung")
+    iban = DataElementField(type='an', max_length=34, _d="IBAN")
+    customer_id = DataElementField(type='id', _d="Kunden-ID")
+    account_type = DataElementField(type='num', max_length=2, _d="Kontoart")
+    account_currency = DataElementField(type='cur', _d="Kontowährung")
+    name_account_owner_1 = DataElementField(type='an', max_length=27, _d="Name des Kontoinhabers 1")
+    name_account_owner_2 = DataElementField(type='an', max_length=27, required=False, _d="Name des Kontoinhabers 2")
+    account_product_name = DataElementField(type='an', max_length=30, required=False, _d="Kontoproduktbezeichnung")
+    account_limit = DataElementGroupField(type=AccountLimit, required=False, _d="Kontolimit")
+    allowed_transactions = DataElementGroupField(type=AllowedTransaction, max_count=999, required=False, _d="Erlaubte Geschäftsvorfälle")
+    extension = DataElementField(type='an', max_length=2048, required=False, _d="Erweiterung, kontobezogen")
 
 class HISYN4(FinTS3Segment):
-    customer_system_id = DataElementField(type='id')
-    message_number = DataElementField(type='num', max_length=4, required=False)
-    security_reference_signature_key = DataElementField(type='num', max_length=16, required=False)
-    security_reference_digital_signature = DataElementField(type='num', max_length=16, required=False)
+    "Synchronisierungsantwort"
+    customer_system_id = DataElementField(type='id', _d="Kundensystem-ID")
+    message_number = DataElementField(type='num', max_length=4, required=False, _d="Nachrichtennummer")
+    security_reference_signature_key = DataElementField(type='num', max_length=16, required=False, _d="Sicherheitsreferenznummer für Signierschlüssel")
+    security_reference_digital_signature = DataElementField(type='num', max_length=16, required=False, _d="Sicherheitsreferenznummer für Digitale Signatur")
 
 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 = DataElementField(type='num', length=1, _d="Sicherheitsklasse")
+    security_class = IntCodeField(SecurityClass, length=1, _d="Sicherheitsklasse")
 
 class HITANSBase(ParameterSegment):
     pass
@@ -197,19 +203,22 @@ class HIPINS1(ParameterSegment):
 
 
 class HIBPA3(FinTS3Segment):
-    bpd_version = DataElementField(type='num', max_length=3)
-    bank_identifier = DataElementGroupField(type=BankIdentifier)
-    bank_name = DataElementField(type='an', max_length=60)
-    number_tasks = DataElementField(type='num', max_length=3)
-    supported_languages = DataElementGroupField(type=SupportedLanguages2)
-    supported_hbci_version = DataElementGroupField(type=SupportedHBCIVersions2)
-    max_message_length = DataElementField(type='num', max_length=4, required=False)
-    min_timeout = DataElementField(type='num', max_length=4, required=False)
-    max_timeout = DataElementField(type='num', max_length=4, required=False)
+    """Bankparameter allgemein, version 3
+
+    Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Formals"""
+    bpd_version = DataElementField(type='num', max_length=3, _d="BPD-Version")
+    bank_identifier = DataElementGroupField(type=BankIdentifier, _d="Kreditinstitutskennung")
+    bank_name = DataElementField(type='an', max_length=60, _d="Kreditinstitutsbezeichnung")
+    number_tasks = DataElementField(type='num', max_length=3, _d="Anzahl Geschäftsvorfallarten pro Nachricht")
+    supported_languages = DataElementGroupField(type=SupportedLanguages2, _d="Unterstützte Sprachen")
+    supported_hbci_version = DataElementGroupField(type=SupportedHBCIVersions2, _d="Unterstützte HBCI-Versionen")
+    max_message_length = DataElementField(type='num', max_length=4, required=False, _d="Maximale Nachrichtengröße")
+    min_timeout = DataElementField(type='num', max_length=4, required=False, _d="Minimaler Timeout-Wert")
+    max_timeout = DataElementField(type='num', max_length=4, required=False, _d="Maximaler Timeout-Wert")
 
 class HISPA1(FinTS3Segment):
-    """SEPA-Kontoverbindung anfordern, version 1
+    """SEPA-Kontoverbindung rückmelden, version 1
 
     Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle 
     """
-    accounts = DataElementGroupField(type=AccountInternational, max_count=999, required=False)
+    accounts = DataElementGroupField(type=AccountInternational, max_count=999, required=False, _d="SEPA-Kontoverbindung")
index fe231868fca61b2ceb5598271cb45a9b4bf06bb5..b6b84e8b3a702611147fc36d6bb1a17bdf66918f 100644 (file)
@@ -76,12 +76,16 @@ class ValueList:
             + "[{}\n".format(first_line_suffix)
         )
         for val in self:
+            if print_doc:
+                docstring = self._parent._inline_doc_comment(val)
+            else:
+                docstring = ""
             if not hasattr( getattr(val, 'print_nested', None), '__call__'):
                 stream.write(
-                    (prefix + (level+1)*indent) + "{!r},\n".format(val)
+                    (prefix + (level+1)*indent) + "{!r}{},\n".format(val, docstring)
                 )
             else:
-                val.print_nested(stream=stream, level=level+2, indent=indent, prefix=prefix, trailer=",", print_doc=print_doc)
+                val.print_nested(stream=stream, level=level+2, indent=indent, prefix=prefix, trailer=",", print_doc=print_doc, first_line_suffix=docstring)
         stream.write( (prefix + level*indent) + "]{}\n".format(trailer) )
 
 class SegmentSequence:
@@ -112,7 +116,14 @@ class SegmentSequence:
             + "\n"
         )
         for segment in self.segments:
-            segment.print_nested(stream=stream, level=level+1, indent=indent, prefix=prefix, first_level_indent=True, trailer=",", print_doc=print_doc)
+            docstring = print_doc and segment.__doc__
+            if docstring:
+                docstring = docstring.splitlines()[0].strip()
+            if docstring:
+                docstring = " # {}".format(docstring)
+            else:
+                docstring = ""
+            segment.print_nested(stream=stream, level=level+1, indent=indent, prefix=prefix, first_level_indent=True, trailer=",", print_doc=print_doc, first_line_suffix=docstring)
         stream.write( (prefix + level*indent) + "]){}\n".format(trailer) )
 
     def find_segments(self, query=None, version=None, callback=None, recurse=True):