diff --git a/account_ebics/__manifest__.py b/account_ebics/__manifest__.py index e436404..3ec3046 100644 --- a/account_ebics/__manifest__.py +++ b/account_ebics/__manifest__.py @@ -3,7 +3,7 @@ { "name": "EBICS banking protocol", - "version": "18.0.1.1.2", + "version": "19.0.1.0.0", "license": "LGPL-3", "author": "Noviat", "website": "https://www.noviat.com/", @@ -22,7 +22,6 @@ "wizards/ebics_admin_order.xml", "views/menu.xml", ], - "installable": True, "application": True, "external_dependencies": { "python": [ diff --git a/account_ebics/data/ebics_file_format.xml b/account_ebics/data/ebics_file_format.xml index 8c40ab0..cf8cafd 100644 --- a/account_ebics/data/ebics_file_format.xml +++ b/account_ebics/data/ebics_file_format.xml @@ -1,4 +1,4 @@ - + diff --git a/account_ebics/migrations/13.0.1.1/noupdate_changes.xml b/account_ebics/migrations/13.0.1.1/noupdate_changes.xml deleted file mode 100644 index 91a4b23..0000000 --- a/account_ebics/migrations/13.0.1.1/noupdate_changes.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - EBICS Configuration model company rule - - - ['|', ('company_ids', '=', False), ('company_ids', 'in', user.company_ids.ids)] - - - - EBICS File model company rule - - - ['|', ('company_ids', '=', False), ('company_ids', 'in', user.company_ids.ids)] - - diff --git a/account_ebics/migrations/13.0.1.1/post-migration.py b/account_ebics/migrations/13.0.1.1/post-migration.py deleted file mode 100644 index 954d6c5..0000000 --- a/account_ebics/migrations/13.0.1.1/post-migration.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2009-2020 Noviat. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -import os - -from openupgradelib import openupgrade # pylint: disable=W7936 - - -@openupgrade.migrate() -def migrate(env, version): - _ebics_config_upgrade(env, version) - _noupdate_changes(env, version) - - -def _ebics_config_upgrade(env, version): - env.cr.execute("SELECT * FROM ebics_config") - cfg_datas = env.cr.dictfetchall() - for cfg_data in cfg_datas: - cfg = env["ebics.config"].browse(cfg_data["id"]) - journal = env["account.journal"].search( - [("bank_account_id", "=", cfg_data["bank_id"])] - ) - keys_fn_old = cfg_data["ebics_keys"] - ebics_keys_root = os.path.dirname(keys_fn_old) - if os.path.isfile(keys_fn_old): - keys_fn = ebics_keys_root + "/" + cfg_data["ebics_user"] + "_keys" - os.rename(keys_fn_old, keys_fn) - state = cfg_data["state"] == "active" and "confirm" or "draft" - cfg.write( - { - "company_ids": [(6, 0, [cfg_data["company_id"]])], - "journal_ids": [(6, 0, journal.ids)], - "ebics_keys": ebics_keys_root, - "state": state, - } - ) - - user_vals = { - "ebics_config_id": cfg_data["id"], - "name": cfg_data["ebics_user"], - } - for fld in [ - "signature_class", - "ebics_passphrase", - "ebics_ini_letter_fn", - "ebics_public_bank_keys_fn", - "ebics_key_x509", - "ebics_key_x509_dn_cn", - "ebics_key_x509_dn_o", - "ebics_key_x509_dn_ou", - "ebics_key_x509_dn_c", - "ebics_key_x509_dn_st", - "ebics_key_x509_dn_l", - "ebics_key_x509_dn_e", - "ebics_file_format_ids", - "state", - ]: - if cfg_data.get(fld): - if fld == "ebics_file_format_ids": - user_vals[fld] = [(6, 0, cfg_data[fld])] - elif fld == "state" and cfg_data["state"] == "active": - user_vals["state"] = "active_keys" - else: - user_vals[fld] = cfg_data[fld] - ebics_userid = env["ebics.userid"].create(user_vals) - env.cr.execute( - f""" - UPDATE ir_attachment - SET res_model = 'ebics.userid', res_id = {ebics_userid.id} - WHERE name in ('ebics_ini_letter', 'ebics_public_bank_keys'); - """ - ) - - if len(cfg_datas) == 1: - env.cr.execute(f"UPDATE ebics_file SET ebics_userid_id = {ebics_userid.id}") - - -def _noupdate_changes(env, version): - openupgrade.load_data( - env.cr, "account_ebics", "migrations/13.0.1.1/noupdate_changes.xml" - ) diff --git a/account_ebics/migrations/13.0.1.1/pre-migration.py b/account_ebics/migrations/13.0.1.1/pre-migration.py deleted file mode 100644 index 53b714f..0000000 --- a/account_ebics/migrations/13.0.1.1/pre-migration.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2009-2020 Noviat. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - - -def migrate(cr, version): - if not version: - return - - cr.execute("DELETE FROM ebics_xfer;") diff --git a/account_ebics/migrations/13.0.1.3/post-migration.py b/account_ebics/migrations/13.0.1.3/post-migration.py deleted file mode 100644 index 97f0878..0000000 --- a/account_ebics/migrations/13.0.1.3/post-migration.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2009-2020 Noviat. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -_FILE_FORMATS = [ - { - "xml_id_name": "ebics_ff_C52", - "download_process_method": "camt.052", - }, - { - "xml_id_name": "ebics_ff_C53", - "download_process_method": "camt.053", - }, - { - "xml_id_name": "ebics_ff_FDL_camt_xxx_cfonb120_stm", - "download_process_method": "cfonb120", - }, -] - - -def migrate(cr, version): - for ff in _FILE_FORMATS: - _update_file_format(cr, ff) - - -def _update_file_format(cr, ff): - cr.execute( # pylint: disable=E8103 - """ - SELECT res_id FROM ir_model_data - WHERE module='account_ebics' AND name='{}' - """.format(ff["xml_id_name"]) - ) - res = cr.fetchone() - if res: - cr.execute( # pylint: disable=E8103 - """ - UPDATE ebics_file_format - SET download_process_method='{download_process_method}' - WHERE id={ff_id}; - """.format( - download_process_method=ff["download_process_method"], ff_id=res[0] - ) - ) diff --git a/account_ebics/migrations/13.0.1.3/pre-migration.py b/account_ebics/migrations/13.0.1.3/pre-migration.py deleted file mode 100644 index 89fcc86..0000000 --- a/account_ebics/migrations/13.0.1.3/pre-migration.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright 2009-2020 Noviat. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -_FILE_FORMATS = [ - { - "old_xml_id_name": "ebics_ff_camt_052_001_02_stm", - "new_xml_id_name": "ebics_ff_C52", - "new_name": "camt.052", - }, - { - "old_xml_id_name": "ebics_ff_camt_053_001_02_stm", - "new_xml_id_name": "ebics_ff_C53", - "new_name": "camt.053", - }, - { - "old_xml_id_name": "ebics_ff_camt_xxx_cfonb120_stm", - "new_xml_id_name": "ebics_ff_FDL_camt_xxx_cfonb120_stm", - }, - { - "old_xml_id_name": "ebics_ff_pain_001_001_03_sct", - "new_xml_id_name": "ebics_ff_CCT", - }, - { - "old_xml_id_name": "ebics_ff_pain_001", - "new_xml_id_name": "ebics_ff_XE2", - "new_name": "pain.001.001.03", - }, - { - "old_xml_id_name": "ebics_ff_pain_008_001_02_sdd", - "new_xml_id_name": "ebics_ff_CDD", - }, - { - "old_xml_id_name": "ebics_ff_pain_008", - "new_xml_id_name": "ebics_ff_XE3", - }, - { - "old_xml_id_name": "ebics_ff_pain_008_001_02_sbb", - "new_xml_id_name": "ebics_ff_CDB", - }, - { - "old_xml_id_name": "ebics_ff_pain_001_001_02_sct", - "new_xml_id_name": "ebics_ff_FUL_pain_001_001_02_sct", - }, -] - - -def migrate(cr, version): - if not version: - return - - for ff in _FILE_FORMATS: - _update_file_format(cr, ff) - - -def _update_file_format(cr, ff): - cr.execute( # pylint: disable=E8103 - """ - SELECT id, res_id FROM ir_model_data - WHERE module='account_ebics' AND name='{}' - """.format(ff["old_xml_id_name"]) - ) - res = cr.fetchone() - if res: - query = """ - UPDATE ir_model_data - SET name='{new_xml_id_name}' - WHERE id={xml_id}; - """.format(new_xml_id_name=ff["new_xml_id_name"], xml_id=res[0]) - if ff.get("new_name"): - query += """ - UPDATE ebics_file_format - SET name='{new_name}' - WHERE id={ff_id}; - """.format(new_name=ff["new_name"], ff_id=res[1]) - cr.execute(query) # pylint: disable=E8103 diff --git a/account_ebics/migrations/15.0.1.1/pre-migration.py b/account_ebics/migrations/15.0.1.1/pre-migration.py deleted file mode 100644 index 28ac779..0000000 --- a/account_ebics/migrations/15.0.1.1/pre-migration.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2009-2022 Noviat. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - - -def migrate(cr, version): - if not version: - return - - cr.execute("select id from ebics_config") - cfg_ids = [x[0] for x in cr.fetchall()] - for cfg_id in cfg_ids: - cr.execute( - """ - SELECT DISTINCT aj.company_id - FROM account_journal_ebics_config_rel rel - JOIN account_journal aj ON rel.account_journal_id = aj.id - WHERE ebics_config_id = %s - """, - (cfg_id,), - ) - new_cpy_ids = [x[0] for x in cr.fetchall()] - cr.execute( - """ - SELECT DISTINCT res_company_id - FROM ebics_config_res_company_rel - WHERE ebics_config_id = %s - """, - (cfg_id,), - ) - old_cpy_ids = [x[0] for x in cr.fetchall()] - - to_add = [] - for cid in new_cpy_ids: - if cid in old_cpy_ids: - old_cpy_ids.remove(cid) - else: - to_add.append(cid) - if old_cpy_ids: - cr.execute( - """ - DELETE FROM ebics_config_res_company_rel - WHERE res_company_id IN %s - """, - (tuple(old_cpy_ids),), - ) - if to_add: - for cid in to_add: - cr.execute( - """ - INSERT INTO ebics_config_res_company_rel(ebics_config_id, res_company_id) - VALUES (%s, %s); - """, - (cfg_id, cid), - ) diff --git a/account_ebics/migrations/17.0.1.2/post-migration.py b/account_ebics/migrations/17.0.1.2/post-migration.py deleted file mode 100644 index 2c5b89e..0000000 --- a/account_ebics/migrations/17.0.1.2/post-migration.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2009-2025 Noviat. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - - -def migrate(cr, version): - cr.execute( # pylint: disable=E8103 - """ - UPDATE ebics_file ef - SET state = 'done' - FROM ebics_file_format eff - WHERE ef.format_id = eff.id - AND eff.type = 'down' - AND eff.download_process_method IS NULL; - """ - ) diff --git a/account_ebics/models/ebics_config.py b/account_ebics/models/ebics_config.py index 26fab66..ff13f6a 100644 --- a/account_ebics/models/ebics_config.py +++ b/account_ebics/models/ebics_config.py @@ -126,7 +126,7 @@ class EbicsConfig(models.Model): @api.model def _default_ebics_keys(self): - return "/".join(["/etc/odoo/ebics_keys", self._cr.dbname]) + return "/".join(["/etc/odoo/ebics_keys", self.env.cr.dbname]) @api.constrains("ebics_key_bitlength") def _check_ebics_key_bitlength(self): @@ -154,6 +154,13 @@ class EbicsConfig(models.Model): ) ) + @api.ondelete(at_uninstall=False) + def _unlink_except_confirm(self): + if any(rec.state == "confirm" for rec in self): + raise UserError( + self.env._("You cannot remove active EBICS configurations.") + ) + def write(self, vals): """ Due to the multi-company nature of the EBICS config we @@ -175,14 +182,6 @@ class EbicsConfig(models.Model): super(EbicsConfig, rec).write({"company_ids": updates}) return True - def unlink(self): - for ebics_config in self: - if ebics_config.state == "active": - raise UserError( - self.env._("You cannot remove active EBICS configurations.") - ) - return super().unlink() - def set_to_draft(self): return self.write({"state": "draft"}) @@ -214,8 +213,8 @@ class EbicsConfig(models.Model): if not os.path.exists(dirname): raise UserError( self.env._( - "EBICS Keys Root Directory %s is not available." - "\nPlease contact your system administrator." + "EBICS Keys Root Directory %(dir)s is not available." + "\nPlease contact your system administrator.", + dir=dirname, ) - % dirname ) diff --git a/account_ebics/models/ebics_file.py b/account_ebics/models/ebics_file.py index a929478..ca68b09 100644 --- a/account_ebics/models/ebics_file.py +++ b/account_ebics/models/ebics_file.py @@ -9,7 +9,7 @@ from traceback import format_exception from lxml import etree -from odoo import fields, models +from odoo import api, fields, models from odoo.exceptions import UserError from odoo.addons.base.models.res_bank import sanitize_account_number @@ -23,13 +23,10 @@ class EbicsFile(models.Model): _name = "ebics.file" _description = "Object to store EBICS Data Files" _order = "date desc" - _sql_constraints = [ - ( - "name_uniq", - "unique (name, format_id)", - "This File has already been down- or uploaded !", - ) - ] + _name_uniq = models.Constraint( + "unique (name, format_id)", + "This File has already been down- or uploaded !", + ) name = fields.Char(string="Filename") data = fields.Binary(string="File", readonly=True) @@ -63,7 +60,6 @@ class EbicsFile(models.Model): ) user_id = fields.Many2one( comodel_name="res.users", - string="User", default=lambda self: self.env.user, readonly=True, ) @@ -85,13 +81,16 @@ class EbicsFile(models.Model): help="Companies sharing this EBICS file.", ) + @api.ondelete(at_uninstall=False) + def _unlink_except_done(self): + if any(rec.state == "done" for rec in self): + raise UserError( + self.env._("You can only remove EBICS files in state 'Draft'.") + ) + def unlink(self): ff_methods = self._file_format_methods() for ebics_file in self: - if ebics_file.state == "done": - raise UserError( - self.env._("You can only remove EBICS files in state 'Draft'.") - ) # execute format specific actions ff = ebics_file.format_id.download_process_method if ff in ff_methods: @@ -637,7 +636,7 @@ class EbicsFile(models.Model): self.env._( "The current version of the 'account_ebics' module " "has no support to automatically process EBICS files " - "with format %s." + "with format %s.", + self.format_id.name, ) - % self.format_id.name ) diff --git a/account_ebics/models/ebics_userid.py b/account_ebics/models/ebics_userid.py index 9a943c6..92f1848 100644 --- a/account_ebics/models/ebics_userid.py +++ b/account_ebics/models/ebics_userid.py @@ -475,8 +475,7 @@ class EbicsUserID(models.Model): if cc in ["FR", "DE"]: lang = cc else: - lang = self.env.user.lang or self.env["res.lang"].search([])[0].code - lang = lang[:2] + lang = self.env.user.lang[:2] lang = lang.lower() lang = lang if lang in INI_LETTER_LANGS else "en" fn_date = fields.Date.today().isoformat() diff --git a/account_ebics/security/ebics_security.xml b/account_ebics/security/ebics_security.xml index f55664d..3c65677 100644 --- a/account_ebics/security/ebics_security.xml +++ b/account_ebics/security/ebics_security.xml @@ -1,8 +1,8 @@ - + - + EBICS Manager - + diff --git a/account_ebics/views/ebics_config_views.xml b/account_ebics/views/ebics_config_views.xml index b94c500..13bf5be 100644 --- a/account_ebics/views/ebics_config_views.xml +++ b/account_ebics/views/ebics_config_views.xml @@ -1,4 +1,4 @@ - + ebics.config.list diff --git a/account_ebics/views/ebics_file_format_views.xml b/account_ebics/views/ebics_file_format_views.xml index 99fc173..46a23a6 100644 --- a/account_ebics/views/ebics_file_format_views.xml +++ b/account_ebics/views/ebics_file_format_views.xml @@ -1,4 +1,4 @@ - + ebics.file.format.search diff --git a/account_ebics/views/ebics_file_views.xml b/account_ebics/views/ebics_file_views.xml index 59c1d38..1368a56 100644 --- a/account_ebics/views/ebics_file_views.xml +++ b/account_ebics/views/ebics_file_views.xml @@ -1,4 +1,4 @@ - + ebics.file.search @@ -21,7 +21,7 @@ domain="[('state', '=', 'draft')]" /> - + ebics.file.form ebics.file - 1 +
@@ -173,7 +173,7 @@ ebics.file.process.result ebics.file - 100 + diff --git a/account_ebics/views/ebics_userid_views.xml b/account_ebics/views/ebics_userid_views.xml index 1066b00..bda39c9 100644 --- a/account_ebics/views/ebics_userid_views.xml +++ b/account_ebics/views/ebics_userid_views.xml @@ -1,4 +1,4 @@ - + ebics.userid.list diff --git a/account_ebics/views/menu.xml b/account_ebics/views/menu.xml index 3969fc4..54d738a 100644 --- a/account_ebics/views/menu.xml +++ b/account_ebics/views/menu.xml @@ -1,4 +1,4 @@ - + + EBICS Administrative Order ebics.admin.order - 1 + 1 @@ -31,7 +31,7 @@ EBICS Administrative Order result ebics.admin.order - 2 + diff --git a/account_ebics/wizards/ebics_change_passphrase.xml b/account_ebics/wizards/ebics_change_passphrase.xml index 549ca4e..67e2af4 100644 --- a/account_ebics/wizards/ebics_change_passphrase.xml +++ b/account_ebics/wizards/ebics_change_passphrase.xml @@ -1,9 +1,9 @@ - + EBICS Keys Change Passphrase ebics.change.passphrase - 1 + @@ -40,7 +40,7 @@ EBICS Keys Change Passphrase ebics.change.passphrase - 2 + diff --git a/account_ebics/wizards/ebics_xfer.py b/account_ebics/wizards/ebics_xfer.py index 1c0ad01..7c52e97 100644 --- a/account_ebics/wizards/ebics_xfer.py +++ b/account_ebics/wizards/ebics_xfer.py @@ -196,7 +196,7 @@ class EbicsXfer(models.TransientModel): def ebics_upload(self): self.ensure_one() - ctx = self._context.copy() + ctx = self.env.context.copy() ebics_file = self._ebics_upload() if ebics_file: ctx["ebics_file_id"] = ebics_file.id @@ -221,9 +221,9 @@ class EbicsXfer(models.TransientModel): client = self._setup_client() if not client: err_cnt += 1 - self.note += ( - self.env._("EBICS client setup failed for connection '%s'") - % self.ebics_config_id.name + self.note += self.env._( + "EBICS client setup failed for connection '%s'", + self.ebics_config_id.name, ) else: download_formats = ( @@ -332,11 +332,8 @@ class EbicsXfer(models.TransientModel): if ebics_files: self.note += "\n" for f in ebics_files: - self.note += ( - self.env._( - "EBICS File '%s' is available for further processing." - ) - % f.name + self.note += self.env._( + "EBICS File '%s' is available for further processing.", f.name ) self.note += "\n" @@ -360,7 +357,7 @@ class EbicsXfer(models.TransientModel): act = self.env["ir.actions.act_window"]._for_xml_id( f"{module}.ebics_file_action_download" ) - act["domain"] = [("id", "in", self._context["ebics_file_ids"])] + act["domain"] = [("id", "in", self.env.context["ebics_file_ids"])] return act def _ebics_upload(self): @@ -402,14 +399,13 @@ class EbicsXfer(models.TransientModel): OrderID = client.upload(order_type, upload_data) if OrderID: self.note += "\n" - self.note += ( - self.env._("EBICS File has been uploaded (OrderID %s).") - % OrderID + self.note += self.env._( + "EBICS File has been uploaded (OrderID %s).", OrderID ) - ef_note = self.env._("EBICS OrderID: %s") % OrderID + ef_note = self.env._("EBICS OrderID: %s", OrderID) if self.env.context.get("origin"): - ef_note += ( - "\n" + self.env._("Origin: %s") % self._context["origin"] + ef_note += "\n" + self.env._( + "Origin: %s", self.env.context["origin"] ) suffix = self.format_id.suffix fn = self.upload_fname @@ -421,7 +417,7 @@ class EbicsXfer(models.TransientModel): "date": fields.Datetime.now(), "format_id": self.format_id.id, "state": "done", - "user_id": self._uid, + "user_id": self.env.uid, "ebics_userid_id": self.ebics_userid_id.id, "note": ef_note, "company_ids": [ @@ -598,9 +594,9 @@ class EbicsXfer(models.TransientModel): self.env._( "EBICS File with name '%s' has already been downloaded." "\nPlease check this file and rename in case there is " - "no risk on duplicate transactions." + "no risk on duplicate transactions.", + fn, ) - % fn ) data = base64.encodebytes(data) ef_vals = { @@ -611,7 +607,7 @@ class EbicsXfer(models.TransientModel): "date_to": self.date_to, "format_id": file_format.id, "state": file_format.download_process_method and "draft" or "done", - "user_id": self._uid, + "user_id": self.env.uid, "ebics_userid_id": self.ebics_userid_id.id, "company_ids": self.ebics_config_id.company_ids.ids, } diff --git a/account_ebics/wizards/ebics_xfer.xml b/account_ebics/wizards/ebics_xfer.xml index 517023f..60f5a5b 100644 --- a/account_ebics/wizards/ebics_xfer.xml +++ b/account_ebics/wizards/ebics_xfer.xml @@ -1,9 +1,9 @@ - + EBICS File Download ebics.xfer - 1 + @@ -55,7 +55,7 @@ EBICS File Upload ebics.xfer - 1 + @@ -120,7 +120,7 @@ EBICS File Transfer ebics.xfer - 2 +