Source code for anyblok_product.bloks.product_family.family
"""Family model
"""
from datetime import datetime
from logging import getLogger
from anyblok import Declarations
from anyblok.column import (
String,
Text,
Selection,
DateTime,
Integer
)
from anyblok.field import Function
from anyblok.relationship import Many2One
from anyblok_postgres.column import Jsonb
logger = getLogger(__name__)
Model = Declarations.Model
register = Declarations.register
[docs]@Declarations.register(Model.Product)
class Family:
"""Product.Family class
"""
FAMILY_CODE = None
family_schema = None
template_schema = None
item_schema = None
id = Integer(label="Identifier", primary_key=True)
create_date = DateTime(default=datetime.now, nullable=False)
edit_date = DateTime(default=datetime.now, nullable=False,
auto_update=True)
code = String(label="Family code", unique=True, nullable=False)
name = String(label="Family name", size=256)
description = Text(label="Family description")
properties = Jsonb(label="Family properties")
family_code = Selection(selections='get_family_codes')
items = Function(fget="fget_items")
[docs] @classmethod
def get_family_codes(cls):
return dict()
[docs] def fget_items(self):
"""Returns a list of products instance from this family
"""
return self.registry.InstrumentedList(
set([i for t in self.templates for i in t.items]))
[docs] @classmethod
def create(cls, **kwargs):
data = kwargs.copy()
if cls.family_schema:
sch = cls.family_schema(registry=cls.registry)
data = sch.load(kwargs)
return cls.insert(**data)
[docs] def amend(self, **kwargs):
data = kwargs.copy()
properties = data.pop('properties', dict())
if properties:
for k, v in properties.items():
self.properties[k] = v
if self.family_schema:
sch = self.family_schema(registry=self.registry, partial=True)
data.update(dict(properties=self.properties))
data = sch.load(data)
self.update(**data)
return self
[docs] @classmethod
def query(cls, *args, **kwargs):
query = super(Family, cls).query(*args, **kwargs)
if cls.__registry_name__ != 'Model.Product.Family':
query = query.filter(cls.family_code == cls.FAMILY_CODE)
return query
[docs] @classmethod
def define_mapper_args(cls):
mapper_args = super(Family, cls).define_mapper_args()
if cls.__registry_name__ == 'Model.Product.Family':
mapper_args.update({'polymorphic_on': cls.family_code})
mapper_args.update({'polymorphic_identity': cls.FAMILY_CODE})
return mapper_args
def __str__(self):
return "%s : %s" % (self.code, self.name)
def __repr__(self):
return "<Product.Family(code=%s, name=%s)>" % (
self.code, self.name)
[docs]@register(Model.Product)
class Template:
"""Add family relationship to template
"""
family = Many2One(label="Family",
model=Declarations.Model.Product.Family,
one2many='templates',
nullable=False)
[docs] @classmethod
def create(cls, family, **kwargs):
data = kwargs.copy()
if family.template_schema:
sch = family.template_schema(registry=cls.registry)
data = sch.load(kwargs, instances=dict(default=family))
return cls.insert(family=family, **data)
[docs] def amend(self, family, **kwargs):
data = kwargs.copy()
properties = data.pop('properties', dict())
if properties:
for k, v in properties.items():
self.properties[k] = v
if family.template_schema:
sch = family.template_schema(registry=self.registry, partial=True)
data.update(dict(properties=self.properties))
data = sch.load(data, instances=dict(default=family))
self.update(family=family, **data)
return self