diff --git a/models/res_users.py b/models/res_users.py
new file mode 100644
index 0000000..6aad1f8
--- /dev/null
+++ b/models/res_users.py
@@ -0,0 +1,72 @@
+import logging
+
+from ast import literal_eval
+from collections import defaultdict
+from dateutil.relativedelta import relativedelta
+
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
+from odoo.osv import expression
+from odoo.tools.misc import ustr
+
+from odoo.addons.base.models.ir_mail_server import MailDeliveryException
+from odoo.addons.auth_signup.models.res_partner import SignupError, now
+
+_logger = logging.getLogger(__name__)
+
+class ResUsers(models.Model):
+ _inherit = 'res.users'
+
+ @api.model
+ def signup(self, values, token=None):
+ """ signup a user, to either:
+ - create a new user (no token), or
+ - create a user for a partner (with token, but no user for partner), or
+ - change the password of a user (with token, and existing user).
+ :param values: a dictionary with field values that are written on user
+ :param token: signup token (optional)
+ :return: (dbname, login, password) for the signed up user
+ """
+ if token:
+ # signup with a token: find the corresponding partner id
+ partner = self.env['res.partner']._signup_retrieve_partner(token, check_validity=True, raise_exception=True)
+ # invalidate signup token
+ partner.write({'signup_token': False, 'signup_type': False, 'signup_expiration': False})
+
+ partner_user = partner.user_ids and partner.user_ids[0] or False
+
+ # avoid overwriting existing (presumably correct) values with geolocation data
+ if partner.country_id or partner.zip or partner.city:
+ values.pop('city', None)
+ values.pop('country_id', None)
+ if partner.lang:
+ values.pop('lang', None)
+
+ if partner_user:
+ # user exists, modify it according to values
+ values.pop('login', None)
+ values.pop('name', None)
+ values.pop('firstname', None)
+ partner_user.write(values)
+ if not partner_user.login_date:
+ partner_user._notify_inviter()
+ return (self.env.cr.dbname, partner_user.login, values.get('password'))
+ else:
+ # user does not exist: sign up invited user
+ values.update({
+ 'name': partner.name,
+ 'firstname': partner.firstname,
+ 'partner_id': partner.id,
+ 'email': values.get('email') or values.get('login'),
+ })
+ if partner.company_id:
+ values['company_id'] = partner.company_id.id
+ values['company_ids'] = [(6, 0, [partner.company_id.id])]
+ partner_user = self._signup_create_user(values)
+ partner_user._notify_inviter()
+ else:
+ # no token, sign up an external user
+ values['email'] = values.get('email') or values.get('login')
+ self._signup_create_user(values)
+
+ return (self.env.cr.dbname, values.get('login'), values.get('password'))
\ No newline at end of file
diff --git a/views/auth_signup_login_templates.xml b/views/auth_signup_login_templates.xml
new file mode 100644
index 0000000..667f107
--- /dev/null
+++ b/views/auth_signup_login_templates.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/views/website_templates.xml b/views/website_templates.xml
new file mode 100644
index 0000000..cf53f4d
--- /dev/null
+++ b/views/website_templates.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file