diff --git a/weboob/backends/bp/backend.py b/weboob/backends/bp/backend.py index 9148ad98..994098d7 100644 --- a/weboob/backends/bp/backend.py +++ b/weboob/backends/bp/backend.py @@ -15,11 +15,13 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + from weboob.capabilities.bank import ICapBank, AccountNotFound from weboob.tools.backend import BaseBackend from weboob.tools.value import ValuesDict, Value -from .browser import BPbrowser +from .browser import BPBrowser + class BPBackend(BaseBackend, ICapBank): NAME = 'bp' @@ -30,7 +32,7 @@ class BPBackend(BaseBackend, ICapBank): DESCRIPTION = u'La banque postale, French bank' CONFIG = ValuesDict(Value('login', label='Account ID'), Value('password', label='Password', masked=True)) - BROWSER = BPbrowser + BROWSER = BPBrowser def create_default_browser(self): return self.create_browser(self.config['login'], self.config['password']) @@ -57,4 +59,3 @@ class BPBackend(BaseBackend, ICapBank): #TODO: retourner le numero du virement #TODO: support the 'reason' parameter return self.browser.make_transfer(from_account, to_account, amount) - diff --git a/weboob/backends/bp/browser.py b/weboob/backends/bp/browser.py index c494a874..df326e23 100644 --- a/weboob/backends/bp/browser.py +++ b/weboob/backends/bp/browser.py @@ -20,69 +20,74 @@ from datetime import datetime from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword, BrowserBanned -from .pages import LoginPage, LoggedPage, CookiePage, AccountList, AccountHistory, BadLoginPage, AccountDesactivate, TransferChooseAccounts, CompleteTransfer, TransferConfirm, TransferSummary +from .pages import LoginPage, LoggedPage, CookiePage, AccountList, AccountHistory, BadLoginPage, AccountDesactivate, \ + TransferChooseAccounts, CompleteTransfer, TransferConfirm, TransferSummary from weboob.capabilities.bank import Transfer -__all__ = ['BPbrowser'] + +__all__ = ['BPBrowser'] -class BPbrowser(BaseBrowser): +class BPBrowser(BaseBrowser): DOMAIN = 'voscomptesenligne.labanquepostale.fr' PROTOCOL = 'https' ENCODING = None # refer to the HTML encoding - PAGES = { r'.*wsost/OstBrokerWeb/loginform.*': LoginPage, - r'.*voscomptes/canalXHTML/identif\.ea.*': LoggedPage, - r'.*voscomptes/canalXHTML/releve/syntheseAssurancesEtComptes\.ea': CookiePage, - r'.*voscomptes/canalXHTML/releve/liste_comptes\.jsp': AccountList, - r'.*canalXHTML/relevesCCP/.*': AccountHistory, - r'.*canalXHTML/relevesEpargnes/.*': AccountHistory, - r'.*ost/messages\.CVS\.html\?param=0x132120c8.*' : BadLoginPage, - r'.*ost/messages\.CVS\.html\?param=0x132120cb.*' : AccountDesactivate, + PAGES = {r'.*wsost/OstBrokerWeb/loginform.*': LoginPage, + r'.*voscomptes/canalXHTML/identif\.ea.*': LoggedPage, + r'.*voscomptes/canalXHTML/releve/syntheseAssurancesEtComptes\.ea': CookiePage, + r'.*voscomptes/canalXHTML/releve/liste_comptes\.jsp': AccountList, + r'.*canalXHTML/relevesCCP/.*': AccountHistory, + r'.*canalXHTML/relevesEpargnes/.*': AccountHistory, + r'.*ost/messages\.CVS\.html\?param=0x132120c8.*' : BadLoginPage, + r'.*ost/messages\.CVS\.html\?param=0x132120cb.*' : AccountDesactivate, - r'.*/virementsafran/aiguillage/saisieComptes\.ea.*': TransferChooseAccounts, - r'.*/virementsafran/aiguillage/2-saisieComptes\.ea.*' : CompleteTransfer, - r'.*/virementsafran/virementnational/2-virementNational\.ea.*' : TransferConfirm, - r'.*/virementsafran/virementnational/4-virementNational\.ea.*' : TransferSummary, - } + r'.*/virementsafran/aiguillage/saisieComptes\.ea.*': TransferChooseAccounts, + r'.*/virementsafran/aiguillage/2-saisieComptes\.ea.*' : CompleteTransfer, + r'.*/virementsafran/virementnational/2-virementNational\.ea.*' : TransferConfirm, + r'.*/virementsafran/virementnational/4-virementNational\.ea.*' : TransferSummary, + } def home(self): - self.location("https://voscomptesenligne.labanquepostale.fr/wsost/OstBrokerWeb/loginform?TAM_OP=login&ERROR_CODE=0x00000000&URL=%2Fvoscomptes%2FcanalXHTML%2Fidentif.ea%3Forigin%3Dparticuliers") + self.location('https://voscomptesenligne.labanquepostale.fr/wsost/OstBrokerWeb/loginform?TAM_OP=login&' + 'ERROR_CODE=0x00000000&URL=%2Fvoscomptes%2FcanalXHTML%2Fidentif.ea%3Forigin%3Dparticuliers') def is_logged(self): return not self.is_on_page(LoginPage) def login(self): if not self.is_on_page(LoginPage): - self.location('https://voscomptesenligne.labanquepostale.fr/wsost/OstBrokerWeb/loginform?TAM_OP=login&ERROR_CODE=0x00000000&URL=%2Fvoscomptes%2FcanalXHTML%2Fidentif.ea%3Forigin%3Dparticuliers', no_login=True) + self.location('https://voscomptesenligne.labanquepostale.fr/wsost/OstBrokerWeb/loginform?TAM_OP=login&' + 'ERROR_CODE=0x00000000&URL=%2Fvoscomptes%2FcanalXHTML%2Fidentif.ea%3Forigin%3Dparticuliers', + no_login=True) self.page.login(self.username, self.password) - if self.is_on_page(BadLoginPage): raise BrowserIncorrectPassword() if self.is_on_page(AccountDesactivate): raise BrowserBanned() def get_accounts_list(self): - self.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/authentification/liste_contrat_atos.ea") - self.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/releve/liste_comptes.jsp") + self.location('https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/authentification/' + 'liste_contrat_atos.ea') + self.location('https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/releve/liste_comptes.jsp') return self.page.get_accounts_list() def get_account(self, id): - if not self.is_on_page(AccountList): - self.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/authentification/liste_contrat_atos.ea") - self.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/releve/liste_comptes.jsp") + self.location('https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/authentification/' + 'liste_contrat_atos.ea') + self.location('https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/releve/liste_comptes.jsp') return self.page.get_account(id) - def get_history(self, Account): self.location(Account.link_id) return self.page.get_history() def make_transfer(self, from_account, to_account, amount): - self.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/virementsafran/aiguillage/saisieComptes.ea") + self.location('https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/virementsafran/aiguillage/' + 'saisieComptes.ea') self.page.set_accouts(from_account, to_account) #TODO: Check diff --git a/weboob/backends/bp/pages/__init__.py b/weboob/backends/bp/pages/__init__.py index f7aeebee..0b10136b 100644 --- a/weboob/backends/bp/pages/__init__.py +++ b/weboob/backends/bp/pages/__init__.py @@ -15,11 +15,13 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + from .login import LoginPage, LoggedPage, BadLoginPage, AccountDesactivate from .cookie import CookiePage from .accountlist import AccountList from .accounthistory import AccountHistory - from .transfer import TransferChooseAccounts, CompleteTransfer, TransferConfirm, TransferSummary -__all__ = ['LoginPage', 'LoggedPage', 'CookiePage', "AccountList", 'AccountHistory', 'BadLoginPage', 'AccountDesactivate', 'TransferChooseAccounts', 'CompleteTransfer', 'TransferConfirm', 'TransferSummary'] + +__all__ = ['LoginPage', 'LoggedPage', 'CookiePage', "AccountList", 'AccountHistory', 'BadLoginPage', + 'AccountDesactivate', 'TransferChooseAccounts', 'CompleteTransfer', 'TransferConfirm', 'TransferSummary'] diff --git a/weboob/backends/bp/pages/accounthistory.py b/weboob/backends/bp/pages/accounthistory.py index 2d18ae0e..893445fb 100644 --- a/weboob/backends/bp/pages/accounthistory.py +++ b/weboob/backends/bp/pages/accounthistory.py @@ -15,18 +15,22 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + import re from weboob.capabilities.bank import Operation from weboob.tools.browser import BasePage + __all__ = ['AccountHistory'] + def remove_html_tags(data): p = re.compile(r'<.*?>') return p.sub(' ', data) + def remove_extra_spaces(data): p = re.compile(r'\s+') return p.sub(' ', data) @@ -34,9 +38,10 @@ def remove_extra_spaces(data): class AccountHistory(BasePage): def on_loaded(self): - if self.document.docinfo.doctype == '': + if self.document.docinfo.doctype == '': self.browser.follow_link(url_regex="releve", tag="a") - + def get_history(self): mvt_table = self.document.xpath("//table[@id='mouvements']", smart_strings=False)[0] mvt_ligne = mvt_table.xpath("./tbody/tr") @@ -49,7 +54,6 @@ class AccountHistory(BasePage): tp = mvt.xpath("./td")[1] operation.label = remove_extra_spaces(remove_html_tags(self.browser.parser.tostring(tp))) - r = re.compile(r'\d+') tp = mvt.xpath("./td/span") amount = None diff --git a/weboob/backends/bp/pages/accountlist.py b/weboob/backends/bp/pages/accountlist.py index 3c7d02bb..d17ba77f 100644 --- a/weboob/backends/bp/pages/accountlist.py +++ b/weboob/backends/bp/pages/accountlist.py @@ -20,14 +20,15 @@ from weboob.capabilities.bank import Account, AccountNotFound from weboob.tools.browser import BasePage + __all__ = ['AccountList'] + class AccountList(BasePage): def on_loaded(self): - self.Account_List = [] + self.account_list = [] def get_accounts_list(self): - #Parse CCP compte_table = self.document.xpath("//table[@id='comptes']", smart_strings=False)[0] compte_ligne = compte_table.xpath("./tbody/tr") @@ -38,8 +39,8 @@ class AccountList(BasePage): account.label = tp.text account.link_id = tp.get("href") account.id = compte.xpath("./td")[1].text - account.balance = float(''.join( compte.xpath("./td/span")[0].text.replace('.','').replace(',','.').split() )) - self.Account_List.append(account) + account.balance = float(''.join(compte.xpath("./td/span")[0].text.replace('.','').replace(',','.').split())) + self.account_list.append(account) #Parse epargne epargne_table = self.document.xpath("//table[@id='comptesEpargne']", smart_strings=False)[0] @@ -51,16 +52,16 @@ class AccountList(BasePage): account.label = tp.text account.link_id = tp.get("href") account.id = epargne.xpath("./td")[1].text - account.balance = float(''.join( epargne.xpath("./td/span")[0].text.replace('.','').replace(',','.').split() ) ) - self.Account_List.append(account) + account.balance = float(''.join(epargne.xpath("./td/span")[0].text.replace('.','').replace(',','.').split())) + self.account_list.append(account) - return self.Account_List + return self.account_list def get_account(self, id): - if not self.Account_List: + if not self.account_list: self.get_accounts_list() - for account in self.Account_List: - if account.id == id: - return account + for account in self.account_list: + if account.id == id: + return account raise AccountNotFound('Unable to find account: %s' % id) diff --git a/weboob/backends/bp/pages/cookie.py b/weboob/backends/bp/pages/cookie.py index bd4e79cd..a200daaa 100644 --- a/weboob/backends/bp/pages/cookie.py +++ b/weboob/backends/bp/pages/cookie.py @@ -16,11 +16,11 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - from weboob.tools.browser import BasePage + __all__ = ['CookiePage'] + class CookiePage(BasePage): - def on_loaded(self): - pass + pass diff --git a/weboob/backends/bp/pages/login.py b/weboob/backends/bp/pages/login.py index f7442e18..a38bc4a2 100644 --- a/weboob/backends/bp/pages/login.py +++ b/weboob/backends/bp/pages/login.py @@ -15,6 +15,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + import hashlib from weboob.tools.browser import BasePage @@ -35,26 +36,32 @@ class LoginPage(BasePage): pass def login(self, login, pwd): - LOCAL_HASH = ['a02574d7bf67677d2a86b7bfc5e864fe', 'eb85e1cc45dd6bdb3cab65c002d7ac8a', '596e6fbd54d5b111fe5df8a4948e80a4', '9cdc989a4310554e7f5484d0d27a86ce', '0183943de6c0e331f3b9fc49c704ac6d', '291b9987225193ab1347301b241e2187', '163279f1a46082408613d12394e4042a', 'b0a9c740c4cada01eb691b4acda4daea', '3c4307ee92a1f3b571a3c542eafcb330', 'dbccecfa2206bfdb4ca891476404cc68'] - process = lambda i: md5(self.browser.retrieve(("https://voscomptesenligne.labanquepostale.fr/wsost/OstBrokerWeb/loginform?imgid=%d&0.25122230781963073" % i ))[0]) - Keypad = [ process(i) for i in range(10)] + LOCAL_HASH = ['a02574d7bf67677d2a86b7bfc5e864fe', 'eb85e1cc45dd6bdb3cab65c002d7ac8a', + '596e6fbd54d5b111fe5df8a4948e80a4', '9cdc989a4310554e7f5484d0d27a86ce', + '0183943de6c0e331f3b9fc49c704ac6d', '291b9987225193ab1347301b241e2187', + '163279f1a46082408613d12394e4042a', 'b0a9c740c4cada01eb691b4acda4daea', + '3c4307ee92a1f3b571a3c542eafcb330', 'dbccecfa2206bfdb4ca891476404cc68', + ] + process = lambda i: md5(self.browser.retrieve(('https://voscomptesenligne.labanquepostale.fr/wsost/OstBrokerWeb' + '/loginform?imgid=%d&0.25122230781963073' % i))[0]) + keypad = [process(i) for i in range(10)] + correspondance = [keypad.index(i) for i in LOCAL_HASH] + newpassword = ''.join(str(correspondance[int(c)]) for c in pwd) - - - - correspondance = [ Keypad.index(i) for i in LOCAL_HASH] - Newpassword = "".join([str(correspondance[int(c)]) for c in pwd]) - - self.browser.select_form(name="formAccesCompte") + self.browser.select_form(name='formAccesCompte') self.browser.set_all_readonly(False) - self.browser["password"] = Newpassword - self.browser["username"] = login + self.browser['password'] = newpassword + self.browser['username'] = login self.browser.submit() + class LoggedPage(BasePage): pass + class BadLoginPage(BasePage): pass + + class AccountDesactivate(BasePage): pass diff --git a/weboob/backends/bp/pages/transfer.py b/weboob/backends/bp/pages/transfer.py index 20f7f364..a1bffe1c 100644 --- a/weboob/backends/bp/pages/transfer.py +++ b/weboob/backends/bp/pages/transfer.py @@ -16,17 +16,17 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +import re + from weboob.capabilities.bank import TransferError from weboob.tools.browser import BasePage from weboob.tools.misc import to_unicode -import re __all__ = ['TransferChooseAccounts', 'CompleteTransfer', 'TransferConfirm', 'TransferSummary'] class TransferChooseAccounts(BasePage): - def set_accouts(self, from_account, to_account): self.browser.select_form(name="AiguillageForm") self.browser["idxCompteEmetteur"] = [from_account.id] @@ -35,16 +35,17 @@ class TransferChooseAccounts(BasePage): class CompleteTransfer(BasePage): - def complete_transfer(self, amount): self.browser.select_form(name="VirementNationalForm") self.browser["montant"] = str(amount) self.browser.submit() -class TransferConfirm(BasePage): +class TransferConfirm(BasePage): def confirm(self): - self.browser.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/virementsafran/virementnational/4-virementNational.ea") + self.browser.location('https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/virementsafran/' + 'virementnational/4-virementNational.ea') + class TransferSummary(BasePage): def get_transfer_id(self): @@ -56,7 +57,6 @@ class TransferSummary(BasePage): except UnicodeDecodeError, error: text = error.object.strip() - match = re.search("Votre virement N.+ ([0-9]+) ", text) if match: id_transfer = match.groups()[0] diff --git a/weboob/backends/dlfp/backend.py b/weboob/backends/dlfp/backend.py index ffa069be..53212f29 100644 --- a/weboob/backends/dlfp/backend.py +++ b/weboob/backends/dlfp/backend.py @@ -15,6 +15,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + from __future__ import with_statement from weboob.tools.backend import BaseBackend @@ -144,7 +145,8 @@ class DLFPBackend(BaseBackend, ICapMessages, ICapMessagesPost): yield m def set_message_read(self, message): - self.storage.set('seen', message.thread.id, 'comments', self.storage.get('seen', message.thread.id, 'comments', default=[]) + [message.id]) + self.storage.set('seen', message.thread.id, 'comments', + self.storage.get('seen', message.thread.id, 'comments', default=[]) + [message.id]) self.storage.save() def post_message(self, message): diff --git a/weboob/tools/application/qt/backendcfg.py b/weboob/tools/application/qt/backendcfg.py index 913eee60..07eb31fb 100644 --- a/weboob/tools/application/qt/backendcfg.py +++ b/weboob/tools/application/qt/backendcfg.py @@ -15,6 +15,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + from PyQt4.QtGui import QDialog, QTreeWidgetItem, QLabel, QFormLayout, \ QMessageBox, QPixmap, QImage, QIcon, QHeaderView, \ QListWidgetItem, QTextDocument, QVBoxLayout, \ @@ -30,6 +31,7 @@ from weboob.tools.application.qt.backendcfg_ui import Ui_BackendCfg from weboob.tools.ordereddict import OrderedDict from .qt import QtValue + class BackendCfg(QDialog): def __init__(self, weboob, caps=None, parent=None): QDialog.__init__(self, parent) @@ -69,8 +71,10 @@ class BackendCfg(QDialog): self.loadConfiguredBackendsList() - self.connect(self.ui.configuredBackendsList, SIGNAL('itemClicked(QTreeWidgetItem *, int)'), self.configuredBackendClicked) - self.connect(self.ui.configuredBackendsList, SIGNAL('itemChanged(QTreeWidgetItem *, int)'), self.configuredBackendEnabled) + self.connect(self.ui.configuredBackendsList, SIGNAL('itemClicked(QTreeWidgetItem *, int)'), + self.configuredBackendClicked) + self.connect(self.ui.configuredBackendsList, SIGNAL('itemChanged(QTreeWidgetItem *, int)'), + self.configuredBackendEnabled) self.connect(self.ui.backendsList, SIGNAL('itemSelectionChanged()'), self.backendSelectionChanged) self.connect(self.ui.proxyBox, SIGNAL('toggled(bool)'), self.proxyEditEnabled) self.connect(self.ui.addButton, SIGNAL('clicked()'), self.addEvent) @@ -91,7 +95,8 @@ class BackendCfg(QDialog): continue item = QTreeWidgetItem(None, [instance_name, name]) - item.setCheckState(0, Qt.Checked if params.get('_enabled', '1').lower() in ('1', 'y', 'true') else Qt.Unchecked) + item.setCheckState(0, Qt.Checked if params.get('_enabled', '1').lower() in ('1', 'y', 'true') \ + else Qt.Unchecked) if backend.icon_path: img = QImage(backend.icon_path) @@ -136,8 +141,8 @@ class BackendCfg(QDialog): bname = unicode(item.text(0)) reply = QMessageBox.question(self, self.tr('Remove a backend'), - unicode(self.tr("Are you sure you want to remove the backend '%s'?")) % bname, - QMessageBox.Yes|QMessageBox.No) + unicode(self.tr("Are you sure you want to remove the backend '%s'?")) % bname, + QMessageBox.Yes|QMessageBox.No) if reply != QMessageBox.Yes: return @@ -197,7 +202,7 @@ class BackendCfg(QDialog): if not selection: QMessageBox.critical(self, self.tr('Unable to add a configured backend'), - self.tr('Please select a backend')) + self.tr('Please select a backend')) return try: @@ -207,26 +212,24 @@ class BackendCfg(QDialog): if not backend: QMessageBox.critical(self, self.tr('Unable to add a configured backend'), - self.tr('The selected backend does not exist.')) + self.tr('The selected backend does not exist.')) return params = {} if not bname: - QMessageBox.critical(self, self.tr('Missing field'), - self.tr('Please specify a backend name')) + QMessageBox.critical(self, self.tr('Missing field'), self.tr('Please specify a backend name')) return if self.ui.nameEdit.isEnabled() and not re.match(r'^[\w\-_]+$', bname): QMessageBox.critical(self, self.tr('Invalid value'), - self.tr('The backend name can only contain letters and digits')) + self.tr('The backend name can only contain letters and digits')) return if self.ui.proxyBox.isChecked(): params['_proxy'] = unicode(self.ui.proxyEdit.text()) if not params['_proxy']: - QMessageBox.critical(self, self.tr('Missing field'), - self.tr('Please specify a proxy URL')) + QMessageBox.critical(self, self.tr('Missing field'), self.tr('Please specify a proxy URL')) return for key, field in backend.config.iteritems(): @@ -235,9 +238,8 @@ class BackendCfg(QDialog): try: value = qtvalue.get_value() except ValueError, e: - QMessageBox.critical(self, - self.tr('Invalid value'), - unicode(self.tr('Invalid value for field "%s":

%s')) % (field.label, e)) + QMessageBox.critical(self, self.tr('Invalid value'), + unicode(self.tr('Invalid value for field "%s":

%s')) % (field.label, e)) return params[key] = value.value @@ -270,26 +272,28 @@ class BackendCfg(QDialog): if backend.icon_path: img = QImage(backend.icon_path) - self.ui.backendInfo.document().addResource(QTextDocument.ImageResource, QUrl('mydata://logo.png'), QVariant(img)) + self.ui.backendInfo.document().addResource(QTextDocument.ImageResource, QUrl('mydata://logo.png'), + QVariant(img)) self.ui.backendInfo.setText(unicode(self.tr( - '

%s Backend %s

' - 'Version: %s
' - 'Maintainer: %s
' - 'License: %s
' - '%s' - 'Description: %s
' - 'Capabilities: %s
')) - % ('' if backend.icon_path else '', - backend.name.capitalize(), - backend.version, - backend.maintainer.replace('&', '&').replace('<', '<').replace('>', '>'), - backend.license, - (unicode(self.tr('Website: %s
')) % backend.website) if backend.website else '', - backend.description, - ', '.join(sorted(cap.__name__.replace('ICap', '') for cap in backend.iter_caps())))) + '

%s Backend %s

' + 'Version: %s
' + 'Maintainer: %s
' + 'License: %s
' + '%s' + 'Description: %s
' + 'Capabilities: %s
')) + % ('' if backend.icon_path else '', + backend.name.capitalize(), + backend.version, + backend.maintainer.replace('&', '&').replace('<', '<').replace('>', '>'), + backend.license, + (unicode(self.tr('Website: %s
')) % backend.website) if backend.website else '', + backend.description, + ', '.join(sorted(cap.__name__.replace('ICap', '') for cap in backend.iter_caps())))) - if backend.has_caps(ICapAccount) and self.ui.nameEdit.isEnabled() and backend.klass.ACCOUNT_REGISTER_PROPERTIES is not None: + if backend.has_caps(ICapAccount) and self.ui.nameEdit.isEnabled() and \ + backend.klass.ACCOUNT_REGISTER_PROPERTIES is not None: self.ui.registerButton.show() else: self.ui.registerButton.hide() @@ -347,9 +351,8 @@ class BackendCfg(QDialog): try: v = widget.get_value() except ValueError, e: - QMessageBox.critical(self, - self.tr('Invalid value'), - unicode(self.tr('Invalid value for field "%s":

%s')) % (key, e)) + QMessageBox.critical(self, self.tr('Invalid value'), + unicode(self.tr('Invalid value for field "%s":

%s')) % (key, e)) end = False break else: @@ -358,9 +361,8 @@ class BackendCfg(QDialog): try: backend.klass.register_account(account) except AccountRegisterError, e: - QMessageBox.critical(self, - self.tr('Error during register'), - unicode(self.tr('Unable to register account %s:

%s')) % (website, e)) + QMessageBox.critical(self, self.tr('Error during register'), + unicode(self.tr('Unable to register account %s:

%s')) % (website, e)) end = False else: for key, value in account.properties.iteritems():