# custom_auth/controllers/main.py from odoo import http, _ from odoo.http import request from werkzeug.utils import redirect class CustomAuthController(http.Controller): # ------------------------- # SIGNUP PAGE # ------------------------- @http.route(['/custom/signup'], type='http', auth='public', website=True) def signup_page(self, **kw): return request.render('custom_auth.signup_template', {}) @http.route(['/custom/signup/submit'], type='http', methods=['POST'], auth='public', website=True, csrf=True) def signup_submit(self, **post): name = post.get('name', '').strip() login = post.get('login', '').strip() password = post.get('password', '') confirm = post.get('confirm_password', '') errors = [] # Simple validation if not name: errors.append(_("Name is required")) if not login: errors.append(_("Email is required")) if not password: errors.append(_("Password is required")) if password != confirm: errors.append(_("Passwords do not match")) # Email already exists? existing_user = request.env['res.users'].sudo().search([('login', '=', login)], limit=1) if existing_user: errors.append(_("A user with this email already exists.")) if errors: return request.render('custom_auth.signup_template', { 'errors': errors, 'values': post }) # Create partner Partner = request.env['res.partner'].sudo().create({ 'name': name, 'email': login, }) # Create user try: User = request.env['res.users'].sudo().create({ 'name': name, 'login': login, 'email': login, 'partner_id': Partner.id, 'password': password, }) # Add user to portal group portal_group = request.env.ref('base.group_portal') User.sudo().write({'groups_id': [(4, portal_group.id)]}) except Exception as e: errors.append(_("Error creating user: %s") % e) return request.render('custom_auth.signup_template', { 'errors': errors, 'values': post }) # Auto login try: db = request.session.db request.session.authenticate(db, login, password) except: return redirect('/custom/login?signup=ok') return redirect('/') # ------------------------- # LOGIN PAGE # ------------------------- @http.route(['/custom/login'], type='http', auth='public', website=True) def login_page(self, **kw): message = None if kw.get("signup") == "ok": message = _("Signup successful. Please log in.") return request.render("custom_auth.login_template", {'message': message}) @http.route(['/custom/login/submit'], type='http', methods=['POST'], auth='public', website=True, csrf=True) def login_submit(self, **post): login = post.get('login', '').strip() password = post.get('password', '') if not login or not password: return request.render('custom_auth.login_template', { 'errors': [_("Enter both email and password.")], 'values': post }) db = request.session.db try: request.session.authenticate(db, login, password) except: return request.render('custom_auth.login_template', { 'errors': [_("Incorrect email or password.")], 'values': post }) next_url = post.get('redirect') or '/' return redirect(next_url) # ------------------------- # LOGOUT # ------------------------- @http.route(['/custom/logout'], type='http', auth='user', website=True) def logout(self, **kw): request.session.logout(keep_db=True) return redirect('/')