summaryrefslogtreecommitdiff
path: root/addons/website/models/res_users.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website/models/res_users.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website/models/res_users.py')
-rw-r--r--addons/website/models/res_users.py100
1 files changed, 100 insertions, 0 deletions
diff --git a/addons/website/models/res_users.py b/addons/website/models/res_users.py
new file mode 100644
index 00000000..d64f94db
--- /dev/null
+++ b/addons/website/models/res_users.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+import logging
+
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import ValidationError
+from odoo.http import request
+
+_logger = logging.getLogger(__name__)
+
+
+class ResUsers(models.Model):
+ _inherit = 'res.users'
+
+ website_id = fields.Many2one('website', related='partner_id.website_id', store=True, related_sudo=False, readonly=False)
+
+ _sql_constraints = [
+ # Partial constraint, complemented by a python constraint (see below).
+ ('login_key', 'unique (login, website_id)', 'You can not have two users with the same login!'),
+ ]
+
+ def _has_unsplash_key_rights(self):
+ self.ensure_one()
+ if self.has_group('website.group_website_designer'):
+ return True
+ return super(ResUsers, self)._has_unsplash_key_rights()
+
+ @api.constrains('login', 'website_id')
+ def _check_login(self):
+ """ Do not allow two users with the same login without website """
+ self.flush(['login', 'website_id'])
+ self.env.cr.execute(
+ """SELECT login
+ FROM res_users
+ WHERE login IN (SELECT login FROM res_users WHERE id IN %s AND website_id IS NULL)
+ AND website_id IS NULL
+ GROUP BY login
+ HAVING COUNT(*) > 1
+ """,
+ (tuple(self.ids),)
+ )
+ if self.env.cr.rowcount:
+ raise ValidationError(_('You can not have two users with the same login!'))
+
+ @api.model
+ def _get_login_domain(self, login):
+ website = self.env['website'].get_current_website()
+ return super(ResUsers, self)._get_login_domain(login) + website.website_domain()
+
+ @api.model
+ def _get_login_order(self):
+ return 'website_id, ' + super(ResUsers, self)._get_login_order()
+
+ @api.model
+ def _signup_create_user(self, values):
+ current_website = self.env['website'].get_current_website()
+ if request and current_website.specific_user_account:
+ values['company_id'] = current_website.company_id.id
+ values['company_ids'] = [(4, current_website.company_id.id)]
+ values['website_id'] = current_website.id
+ new_user = super(ResUsers, self)._signup_create_user(values)
+ return new_user
+
+ @api.model
+ def _get_signup_invitation_scope(self):
+ current_website = self.env['website'].get_current_website()
+ return current_website.auth_signup_uninvited or super(ResUsers, self)._get_signup_invitation_scope()
+
+ @classmethod
+ def authenticate(cls, db, login, password, user_agent_env):
+ """ Override to link the logged in user's res.partner to website.visitor.
+ If both a request-based visitor and a user-based visitor exist we try
+ to update them (have same partner_id), and move sub records to the main
+ visitor (user one). Purpose is to try to keep a main visitor with as
+ much sub-records (tracked pages, leads, ...) as possible. """
+ uid = super(ResUsers, cls).authenticate(db, login, password, user_agent_env)
+ if uid:
+ with cls.pool.cursor() as cr:
+ env = api.Environment(cr, uid, {})
+ visitor_sudo = env['website.visitor']._get_visitor_from_request()
+ if visitor_sudo:
+ user_partner = env.user.partner_id
+ other_user_visitor_sudo = env['website.visitor'].with_context(active_test=False).sudo().search(
+ [('partner_id', '=', user_partner.id), ('id', '!=', visitor_sudo.id)],
+ order='last_connection_datetime DESC',
+ ) # current 13.3 state: 1 result max as unique visitor / partner
+ if other_user_visitor_sudo:
+ visitor_main = other_user_visitor_sudo[0]
+ other_visitors = other_user_visitor_sudo[1:] # normally void
+ (visitor_sudo + other_visitors)._link_to_visitor(visitor_main, keep_unique=True)
+ visitor_main.name = user_partner.name
+ visitor_main.active = True
+ visitor_main._update_visitor_last_visit()
+ else:
+ if visitor_sudo.partner_id != user_partner:
+ visitor_sudo._link_to_partner(
+ user_partner,
+ update_values={'partner_id': user_partner.id})
+ visitor_sudo._update_visitor_last_visit()
+ return uid