From e6d0fc897ad3ed482c94e2ae1fcc6b83b3a70f93 Mon Sep 17 00:00:00 2001 From: hparfr Date: Fri, 4 May 2018 11:12:44 +0200 Subject: [PATCH] Add default validation logic The goal was to force developers to write validation logic. Now it's becoming useless with keychain.backend And it adds boilerplate code. In this commit, we set a permissive default validation logic. It will reduce code in consumers module and still allow fine grained validation. --- keychain/__manifest__.py | 2 +- keychain/models/keychain.py | 47 +++++++++++++++++++++++++++++++++ keychain/tests/test_keychain.py | 21 +++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/keychain/__manifest__.py b/keychain/__manifest__.py index 657433280..0e039de42 100644 --- a/keychain/__manifest__.py +++ b/keychain/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Keychain", "summary": "Store accounts and credentials", - "version": "10.0.2.0.0", + "version": "10.0.2.0.1", "category": "Uncategorized", "website": "https://akretion.com/", "author": "Akretion, Odoo Community Association (OCA)", diff --git a/keychain/models/keychain.py b/keychain/models/keychain.py index 77e82bd20..e0f78717e 100644 --- a/keychain/models/keychain.py +++ b/keychain/models/keychain.py @@ -116,12 +116,59 @@ class KeychainAccount(models.Model): @implemented_by_keychain def _validate_data(self, data): + """Ensure data is valid according to the namespace. + + How to use: + - Create a method prefixed with your namespace + - Put your validation logic inside + - Return true if data is valid for your usage + + This method will be called on write(). + If false is returned an user error will be raised. + + Example: + def _hereismynamspace_validate_data(): + return len(data.get('some_param', '') > 6) + + @params data dict + @returns boolean + """ pass + def _default_validate_data(self, data): + """Default validation. + + By default says data is always valid. + See _validata_data() for more information. + """ + return True + @implemented_by_keychain def _init_data(self): + """Initialize data field. + + How to use: + - Create a method prefixed with your namespace + - Return a dict with the keys and may be default + values your expect. + + This method will be called on write(). + + Example: + def _hereismynamspace_init_data(): + return { 'some_param': 'default_value' } + + @returns dict + """ pass + def _default_init_data(self): + """Default initialization. + + See _init_data() for more information. + """ + return {} + @staticmethod def _retrieve_env(): """Return the current environments. diff --git a/keychain/tests/test_keychain.py b/keychain/tests/test_keychain.py index 8b72bb29c..b3aebd6e9 100644 --- a/keychain/tests/test_keychain.py +++ b/keychain/tests/test_keychain.py @@ -221,3 +221,24 @@ class TestKeychain(TransactionCase): self.assertTrue(True, 'Should validate json') except: self.assertTrue(False, 'It should validate a good json') + + def test_default_init_and_valid(self): + """.""" + self.keychain._fields['namespace'].selection.append( + ('keychain_test_default', 'test') + ) + account = self.keychain.create({ + "name": "test", + "namespace": "keychain_test_default", + "login": "test", + "technical_name": "keychain.test" + }) + try: + account.write({"login": "test default"}) + except ValidationError: + self.assertTrue(False, 'It should validate any json in default') + + self.assertEqual( + account.data, account._serialize_data( + account._default_init_data()), + 'Data should be default value')