78 lines
2.7 KiB
Python
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)
|