From eab5cc608e8ee69550fe8590c3e9eecf0e295823 Mon Sep 17 00:00:00 2001 From: "Pieter J. Kersten" Date: Thu, 10 Mar 2011 16:25:05 +0100 Subject: [PATCH] [IMP] account_banking, account_banking_nl_clieop: improved casting of data --- account_banking/__terp__.py | 2 +- account_banking/record.py | 21 +++++++------ account_banking_fi_patu/__terp__.py | 2 +- account_banking_nl_clieop/__terp__.py | 2 +- account_banking_nl_clieop/wizard/clieop.py | 36 +++++++++++++--------- account_banking_nl_girotel/__terp__.py | 2 +- account_banking_nl_multibank/__terp__.py | 2 +- 7 files changed, 38 insertions(+), 29 deletions(-) diff --git a/account_banking/__terp__.py b/account_banking/__terp__.py index 913b363c2..9c931b771 100644 --- a/account_banking/__terp__.py +++ b/account_banking/__terp__.py @@ -25,7 +25,7 @@ ############################################################################## { 'name': 'Account Banking', - 'version': '0.1.53', + 'version': '0.1.54', 'license': 'GPL-3', 'author': 'EduSense BV', 'website': 'http://www.edusense.nl', diff --git a/account_banking/record.py b/account_banking/record.py index 694672b98..8baa9b317 100644 --- a/account_banking/record.py +++ b/account_banking/record.py @@ -43,20 +43,21 @@ import unicodedata class Field(object): '''Base Field class - fixed length left aligned string field in a record''' - def __init__(self, name, length=1, fillchar=' '): + def __init__(self, name, length=1, fillchar=' ', cast=str): self.name = name.replace(' ', '_') self.length = length self.fillchar = fillchar + self.cast = cast def format(self, value): - value = str(value) + value = self.cast(value) if len(value) > self.length: return value[:self.length] return value.ljust(self.length, self.fillchar) def take(self, buffer): offset = hasattr(self, 'offset') and self.offset or 0 - return buffer[offset:offset + self.length].rstrip(self.fillchar) + return self.cast(buffer[offset:offset + self.length].rstrip(self.fillchar)) def __repr__(self): return '%s "%s"' % (self.__class__.__name__, self.name) @@ -64,7 +65,7 @@ class Field(object): class Filler(Field): '''Constant value field''' def __init__(self, name, length=1, value=' '): - super(Filler, self).__init__(name, length) + super(Filler, self).__init__(name, length, cast=str) self.value = str(value) def take(self, buffer): @@ -77,9 +78,9 @@ class Filler(Field): class DateField(Field): '''Variable date field''' - def __init__(self, name, format='%Y-%m-%d', auto=False): + def __init__(self, name, format='%Y-%m-%d', auto=False, cast=str): length = len(date.today().strftime(format)) - super(DateField, self).__init__(name, length) + super(DateField, self).__init__(name, length, cast=cast) self.dateformat = format self.auto = auto @@ -94,7 +95,7 @@ class DateField(Field): def take(self, buffer): value = super(DateField, self).take(buffer) if value: - return strpdate(value, self.dateformat) + return self.cast(strpdate(value, self.dateformat)) return self.auto and date.today() or None class RightAlignedField(Field): @@ -106,7 +107,7 @@ class RightAlignedField(Field): def take(self, buffer): offset = hasattr(self, 'offset') and self.offset or 0 - return buffer[offset:offset + self.length].lstrip(self.fillchar) + return self.cast(buffer[offset:offset + self.length].lstrip(self.fillchar)) class NumberField(RightAlignedField): '''Deviation of Field: left zero filled''' @@ -115,7 +116,7 @@ class NumberField(RightAlignedField): super(NumberField, self).__init__(*args, **kwargs) def format(self, value): - return super(NumberField, self).format(value and str(value) or '') + return super(NumberField, self).format(self.cast(value or '')) class RecordType(object): fields = [] @@ -186,7 +187,7 @@ class Record(object): return self._recordtype.format(self._value) def __unicode__(self): - return unicode(str(self)) + return unicode(self.cast(self)) def asciify(str): return unicodedata.normalize('NFKD', str).encode('ascii', 'ignore') diff --git a/account_banking_fi_patu/__terp__.py b/account_banking_fi_patu/__terp__.py index 8ba0c0363..bb183cd78 100644 --- a/account_banking_fi_patu/__terp__.py +++ b/account_banking_fi_patu/__terp__.py @@ -26,7 +26,7 @@ ############################################################################## { 'name': 'Account Banking PATU module', - 'version': '0.53', + 'version': '0.54', 'license': 'GPL-3', 'author': 'Sami Haahtinen', 'website': 'http://ressukka.net', diff --git a/account_banking_nl_clieop/__terp__.py b/account_banking_nl_clieop/__terp__.py index cc279b66e..c0e528755 100644 --- a/account_banking_nl_clieop/__terp__.py +++ b/account_banking_nl_clieop/__terp__.py @@ -25,7 +25,7 @@ ############################################################################## { 'name': 'Account Banking NL ClieOp', - 'version': '0.53', + 'version': '0.54', 'license': 'GPL-3', 'author': 'EduSense BV', 'website': 'http://www.edusense.nl', diff --git a/account_banking_nl_clieop/wizard/clieop.py b/account_banking_nl_clieop/wizard/clieop.py index b37151e4d..a7afd262f 100644 --- a/account_banking_nl_clieop/wizard/clieop.py +++ b/account_banking_nl_clieop/wizard/clieop.py @@ -28,12 +28,20 @@ __all__ = ['DirectDebitBatch', 'PaymentsBatch', 'DirectDebit', 'Payment', 'OrdersFile', ] -class StringField(record.Field): - def take(self, buffer): - return convert.to_swift(super(StringField, self).take(buffer)) +class SWIFTField(record.Field): + ''' + A SWIFTField does not assume 'ascii' data. It actively converts data to + SWIFT-specs. + ''' + def __init__(self, *args, **kwargs): + kwargs['cast'] = convert.to_swift + super(SWIFTField, self).__init__(*args, **kwargs) + + #def take(self, buffer): + # return convert.to_swift(super(SWIFTField, self).take(buffer)) - def format(self, value): - return convert.to_swift(super(StringField, self).format(value)) + #def format(self, value): + # return convert.to_swift(super(SWIFTField, self).format(value)) def eleven_test(s): ''' @@ -60,7 +68,7 @@ class HeaderRecord(record.Record): #{{{ record.Filler('variantcode', 1, 'A'), record.DateField('creation_date', '%d%m%y', auto=True), record.Filler('filename', 8, 'CLIEOP03'), - StringField('sender_id', 5), + SWIFTField('sender_id', 5), record.Field('file_id', 4), record.Field('duplicatecode', 1), record.Filler('filler', 21), @@ -90,7 +98,7 @@ class BatchHeaderRecord(record.Record): record.NumberField('accountno_sender', 10), record.NumberField('batch_tracer', 4), record.Filler('currency_order', 3, 'EUR'), - StringField('batch_id', 16), + SWIFTField('batch_id', 16), record.Filler('filler', 10), ] @@ -110,7 +118,7 @@ class FixedMessageRecord(record.Record): _fields = [ record.Filler('recordcode', 4, '0020'), record.Filler('variantcode', 1, 'A'), - StringField('fixed_message', 32), + SWIFTField('fixed_message', 32), record.Filler('filler', 13), ] @@ -122,7 +130,7 @@ class SenderRecord(record.Record): # NAW = Name, Address, Residence record.Field('NAWcode', 1), record.DateField('preferred_execution_date', '%d%m%y', auto=True), - StringField('name_sender', 35), + SWIFTField('name_sender', 35), record.Field('testcode', 1), record.Filler('filler', 2), ] @@ -144,7 +152,7 @@ class NamePayerRecord(record.Record): _fields = [ record.Filler('recordcode', 4, '0110'), record.Filler('variantcode', 1, 'B'), - StringField('name', 35), + SWIFTField('name', 35), record.Filler('filler', 10), ] @@ -153,7 +161,7 @@ class PaymentReferenceRecord(record.Record): _fields = [ record.Filler('recordcode', 4, '0150'), record.Filler('variantcode', 1, 'A'), - StringField('paymentreference', 16), + SWIFTField('paymentreference', 16), record.Filler('filler', 29), ] @@ -162,7 +170,7 @@ class DescriptionRecord(record.Record): _fields = [ record.Filler('recordcode', 4, '0160'), record.Filler('variantcode', 1, 'A'), - StringField('description', 32), + SWIFTField('description', 32), record.Filler('filler', 13), ] @@ -171,7 +179,7 @@ class NameBeneficiaryRecord(record.Record): _fields = [ record.Filler('recordcode', 4, '0170'), record.Filler('variantcode', 1, 'B'), - StringField('name', 35), + SWIFTField('name', 35), record.Filler('filler', 10), ] @@ -179,7 +187,7 @@ class OrderRecord(record.Record): '''Order details''' _fields = [ record.Filler('recordcode', 6, 'KAE092'), - StringField('name_transactioncode', 18), + SWIFTField('name_transactioncode', 18), record.NumberField('total_amount', 13), record.Field('accountno_sender', 10), record.NumberField('total_accountnos', 5), diff --git a/account_banking_nl_girotel/__terp__.py b/account_banking_nl_girotel/__terp__.py index 64c4e641c..f212feb8f 100644 --- a/account_banking_nl_girotel/__terp__.py +++ b/account_banking_nl_girotel/__terp__.py @@ -25,7 +25,7 @@ ############################################################################## { 'name': 'Account Banking - Girotel', - 'version': '0.53', + 'version': '0.54', 'license': 'GPL-3', 'author': 'EduSense BV', 'website': 'http://www.edusense.nl', diff --git a/account_banking_nl_multibank/__terp__.py b/account_banking_nl_multibank/__terp__.py index cc2dcda67..dbc7f64b5 100644 --- a/account_banking_nl_multibank/__terp__.py +++ b/account_banking_nl_multibank/__terp__.py @@ -25,7 +25,7 @@ ############################################################################## { 'name': 'Account Banking', - 'version': '0.53', + 'version': '0.54', 'license': 'GPL-3', 'author': 'EduSense BV', 'website': 'http://www.edusense.nl',