diff --git a/MIGRATION b/MIGRATION new file mode 100644 index 0000000..14f37a7 --- /dev/null +++ b/MIGRATION @@ -0,0 +1,51 @@ +================= +Migration Details +================= + +Version 0.3 +=========== + +1. SQL to move party_address to nereid_user +------------------------------------------- + +Address which was used for login was migrated to nereid_user. To +retain the existing users and their IDs (used in sessions) the +users data needs to be migrated from party.address to nereid.user + +SQL:: + +INSERT INTO nereid_user +SELECT + "address"."id" AS id, + "address"."create_date" AS create_date, + "address"."write_date" AS write_date, + "address"."create_uid" AS create_uid, + "address"."write_uid" AS write_uid, + "party"."company" AS company, + "address"."party" AS party, + "address"."activation_code" AS activation_code, + "address"."salt" AS salt, + "contact_mechanism"."value" AS email, + "address"."password" AS password +FROM party_address AS address +JOIN party_party AS party ON party.id = address.party +LEFT JOIN party_contact_mechanism AS contact_mechanism ON contact_mechanism.id = address.email +WHERE + "address"."email" IS NOT NULL + AND "address"."password" IS NOT NULL + AND "party"."company" IS NOT NULL; + + +2. Application Settings +----------------------- + +`TRYTON_USER` and `GUEST_USER` which were application config parameters in +previous version are now part of `nereid.website` settings. This avoids +looking up IDs of these records from database to then build the app settings. + +This affects two places: + + 1. Application settings in launchers: `TRYTON_USER` and `GUEST_USER` needs + not be specified anymore. + 2. Unit Tests: `application_user` (eqv. of `TRYTON_USER`) and `guest_user` + are not diff --git a/nereid/application.py b/nereid/application.py index 7b534cf..f9934b6 100644 --- a/nereid/application.py +++ b/nereid/application.py @@ -241,7 +241,7 @@ class Nereid(BackendMixin, RoutingMixin, self._before_request_lock = Lock() _PackageBoundObject.__init__(self, __name__) - BackendMixin.__init__(self, **config) + BackendMixin.__init__(self, **config) RoutingMixin.__init__(self, **config) CacheMixin.__init__(self, **config) TemplateMixin.__init__(self, **config) diff --git a/nereid/backend.py b/nereid/backend.py index ea602bc..c157bbc 100644 --- a/nereid/backend.py +++ b/nereid/backend.py @@ -40,6 +40,13 @@ class BackendMixin(object): #: Configuration file for Tryton tryton_configfile = ConfigAttribute('TRYTON_CONFIG') database_name = ConfigAttribute('DATABASE_NAME') + + #: This attribute was previously used to specify ID of the res.user + #: that nereid should be using to connect to Tryton. This attribute + #: is now set during the initialisation of the class. If any attribute + #: is set in the config settings, they are ignored + #: + #: ..versionchanged:0.3 tryton_user = ConfigAttribute('TRYTON_USER') tryton_context = ConfigAttribute('TRYTON_CONTEXT') @@ -48,6 +55,26 @@ class BackendMixin(object): from trytond.config import CONFIG CONFIG.configfile = self.tryton_configfile CONFIG.load() + with self.root_transaction: + website_obj = self.pool.get('nereid.website') + user_obj = self.pool.get('res.user') + + # Find the application_user and guest_user + website_id, = website_obj.search([ + ('name', '=', self.site) + ]) + website = website_obj.browse(website_id) + self.tryton_user = website.application_user.id + self.guest_user = website.guest_user.id + + # Update the Tryton context + if not self.tryton_context: + self.tryton_context = {} + new_context = user_obj._get_preferences( + website.application_user, context_only=True + ) + self.tryton_context.update(new_context) + def load_connection(self): "Actual loading of connection takes place here" @@ -81,7 +108,7 @@ class BackendMixin(object): @property def transaction(self): - """Allows the use of the transaction as a context manager. + """Allows the use of the transaction as a context manager. Example:: @@ -93,6 +120,15 @@ class BackendMixin(object): return TransactionManager( self.database_name, self.tryton_user, self.tryton_context) + @property + def root_transaction(self): + """Allows the use of the transaction as a context manager with the + root user. + + .. versionadded::0.3 + """ + return TransactionManager(self.database_name, 0, self.tryton_context) + def get_method(self, model_method): """Get the object from pool and fetch the method from it diff --git a/nereid/testing.py b/nereid/testing.py index a3c5144..f6fa227 100644 --- a/nereid/testing.py +++ b/nereid/testing.py @@ -285,6 +285,9 @@ def create_site(obj, name, url_map=None, company=None, **options): options['default_language'], = lang_obj.search( [('code', '=', 'en_US')]) + if 'application_user' not in options: + options['application_user'] = 1 + return site_obj.create(options)