Files
tryton/trytond/model/modelsingleton.py
T
2012-09-24 22:16:53 +02:00

95 lines
3.1 KiB
Python

#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from trytond.model import ModelStorage
class ModelSingleton(ModelStorage):
"""
Define a singleton model in Tryton.
"""
@classmethod
def get_singleton(cls):
'''
Return the instance of the unique record if there is one.
'''
singletons = super(ModelSingleton, cls).search([], limit=1)
if singletons:
return singletons[0]
@classmethod
def create(cls, values):
singleton = cls.get_singleton()
if singleton:
cls.write([singleton], values)
else:
singleton = super(ModelSingleton, cls).create(values)
return singleton
@classmethod
def read(cls, ids, fields_names=None):
singleton = cls.get_singleton()
if not singleton:
res = cls.default_get(fields_names, with_rec_name=False)
if not fields_names:
fields_names = (set(cls._fields.keys()
+ cls._inherit_fields.keys()))
for field_name in fields_names:
if field_name not in res:
res[field_name] = False
res['id'] = ids[0]
return [res]
res = super(ModelSingleton, cls).read([singleton.id],
fields_names=fields_names)
res[0]['id'] = ids[0]
return res
@classmethod
def write(cls, records, values):
singleton = cls.get_singleton()
if not singleton:
return cls.create(values)
return super(ModelSingleton, cls).write([singleton], values)
@classmethod
def delete(cls, records):
singleton = cls.get_singleton()
if not singleton:
return
return super(ModelSingleton, cls).delete([singleton])
@classmethod
def copy(cls, records, default=None):
if default:
cls.write(records, default)
return records
@classmethod
def search(cls, domain, offset=0, limit=None, order=None, count=False):
res = super(ModelSingleton, cls).search(domain, offset=offset,
limit=limit, order=order, count=count)
if not res:
if count:
return 1
return [cls(1)]
return res
@classmethod
def default_get(cls, fields_names, with_rec_name=True):
if '_timestamp' in fields_names:
fields_names = list(fields_names)
fields_names.remove('_timestamp')
default = super(ModelSingleton, cls).default_get(fields_names,
with_rec_name=with_rec_name)
singleton = cls.get_singleton()
if singleton:
if with_rec_name:
fields_names = fields_names[:]
for field in fields_names[:]:
if cls._fields[field]._type in ('many2one',):
fields_names.append(field + '.rec_name')
default, = cls.read([singleton.id], fields_names=fields_names)
for field in (x for x in default.keys() if x not in fields_names):
del default[field]
return default