fase 1 productizacion: capa de configuracion (glosario multi-giro, sucursales y categorias configurables, ajustes de clinica por instancia, colores de marca, horarios, URLs de pago dinamicas) + script de provisioning de instancia nueva con datos demo + frontend consumiendo la config
This commit is contained in:
38
odoo-addons/skeen_citas/catalogs.py
Normal file
38
odoo-addons/skeen_citas/catalogs.py
Normal file
@@ -0,0 +1,38 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Utilidades para los catálogos configurables (sucursales, categorías)."""
|
||||
|
||||
import re
|
||||
import unicodedata
|
||||
|
||||
|
||||
def slugify(text):
|
||||
"""'Playa de Rosarito' -> 'playa-de-rosarito' (sin acentos, [a-z0-9-])."""
|
||||
text = unicodedata.normalize('NFKD', str(text or ''))
|
||||
text = text.encode('ascii', 'ignore').decode('ascii')
|
||||
text = re.sub(r'[^a-zA-Z0-9]+', '-', text).strip('-').lower()
|
||||
return text
|
||||
|
||||
|
||||
def unique_slug(model, base, exclude_id=None):
|
||||
"""Slug único para `model` (sufija -2, -3... si ya existe).
|
||||
|
||||
Cuenta también los registros inactivos: el `code` es único a nivel base de
|
||||
datos y las bajas son lógicas, así que un código usado por algo desactivado
|
||||
sigue ocupado.
|
||||
"""
|
||||
model = model.with_context(active_test=False)
|
||||
base = slugify(base) or 'item'
|
||||
domain = [('code', '=', base)]
|
||||
if exclude_id:
|
||||
domain.append(('id', '!=', exclude_id))
|
||||
if not model.search_count(domain):
|
||||
return base
|
||||
n = 2
|
||||
while True:
|
||||
cand = '%s-%d' % (base, n)
|
||||
domain = [('code', '=', cand)]
|
||||
if exclude_id:
|
||||
domain.append(('id', '!=', exclude_id))
|
||||
if not model.search_count(domain):
|
||||
return cand
|
||||
n += 1
|
||||
Reference in New Issue
Block a user