From: Henryk Plötz Date: Thu, 16 Aug 2018 09:31:02 +0000 (+0200) Subject: More docs X-Git-Tag: v2.0.0~1^2~104 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3789fa68003c19efd43ff300ec8960e45a414563;p=thirdparty%2Fpython-fints.git More docs --- diff --git a/fints/fields.py b/fints/fields.py index 6232708..7190175 100644 --- a/fints/fields.py +++ b/fints/fields.py @@ -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] diff --git a/fints/formals.py b/fints/formals.py index 4f88bff..19d2d28 100644 --- a/fints/formals.py +++ b/fints/formals.py @@ -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 diff --git a/fints/segments/__init__.py b/fints/segments/__init__.py index a9f70eb..11e1d98 100644 --- a/fints/segments/__init__.py +++ b/fints/segments/__init__.py @@ -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") diff --git a/fints/types.py b/fints/types.py index fe23186..b6b84e8 100644 --- a/fints/types.py +++ b/fints/types.py @@ -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):