Files
Odoo-Modules/fusion_schedule/models/res_users.py
gsinghpal e56974d46f update
2026-03-16 08:14:56 -04:00

78 lines
2.7 KiB
Python

# -*- coding: utf-8 -*-
import re
import uuid
from odoo import api, fields, models
class ResUsers(models.Model):
_inherit = 'res.users'
x_fc_calendar_account_ids = fields.One2many(
'fusion.calendar.account', 'x_fc_user_id',
string='Connected Calendar Accounts',
)
x_fc_schedule_slug = fields.Char(
string='Booking URL Slug',
help='Unique slug for your public booking page, e.g. /schedule/john-doe',
copy=False,
)
x_fc_booking_enabled = fields.Boolean(
string='Public Booking Enabled',
default=False,
help='Allow external visitors to book your time via a public link.',
)
x_fc_work_start = fields.Float(
string='Work Day Start', default=9.0,
help='Start of your work day as decimal hours (e.g. 9.0 = 9:00 AM)',
)
x_fc_work_end = fields.Float(
string='Work Day End', default=17.0,
help='End of your work day as decimal hours (e.g. 17.0 = 5:00 PM)',
)
x_fc_break_start = fields.Float(
string='Break Start', default=12.0,
help='Fixed break/lunch start time (e.g. 12.0 = 12:00 PM)',
)
x_fc_break_duration = fields.Float(
string='Break Duration (hours)', default=0.5,
help='Break duration in hours (e.g. 0.5 = 30 minutes)',
)
x_fc_travel_buffer = fields.Integer(
string='Travel Buffer (minutes)', default=30,
help='Minimum travel buffer between appointments in minutes',
)
x_fc_home_address = fields.Char(
string='Base/Office Address',
help='Starting address for first appointment travel calculation',
)
x_fc_home_lat = fields.Float(string='Base Latitude', digits=(10, 7))
x_fc_home_lng = fields.Float(string='Base Longitude', digits=(10, 7))
_unique_schedule_slug = models.Constraint(
'UNIQUE(x_fc_schedule_slug)',
'This booking URL slug is already taken. Please choose a different one.',
)
@api.model_create_multi
def create(self, vals_list):
users = super().create(vals_list)
for user in users:
if not user.x_fc_schedule_slug:
user.x_fc_schedule_slug = user._generate_schedule_slug()
return users
def _generate_schedule_slug(self):
"""Generate a URL-safe slug from the user's name."""
self.ensure_one()
name = self.name or 'user'
# Normalize: lowercase, replace spaces with hyphens, remove special chars
slug = re.sub(r'[^a-z0-9\-]', '', name.lower().replace(' ', '-'))
slug = re.sub(r'-+', '-', slug).strip('-')
if not slug:
slug = 'user'
# Add short unique suffix
suffix = uuid.uuid4().hex[:4]
return '%s-%s' % (slug, suffix)