from plone.memoize.view import memoize
from AccessControl import ClassSecurityInfo
from App.class_init import InitializeClass
from Products.DataGridField.Column import Column
class HiddenColumn(Column):
""" Column with non-changeable text
Useful with DataGridField.fixed_row property in some use cases.
"""
security = ClassSecurityInfo()
def __init__(self, label, default=None, label_msgid=None, visible=True):
""" Create a column
@param hide Hide column from displaying
"""
Column.__init__(self, label, default, label_msgid)
self.visible = visible
security.declarePublic('getMacro')
def getMacro(self):
""" Return macro used to render this column in view/edit """
return "referencedatagrid_hidden_cell"
# Initializes class security
InitializeClass(HiddenColumn)
class BlockColumn(Column):
""" Column with possibility to block the cell data from changing,
based on the value of the row data.
"""
security = ClassSecurityInfo()
def __init__(self, label, default=None, label_msgid=None,
column_on_class=None, column_off_class=None,
columns=[], invert=False, read_only=None):
""" Create a column, with adding class attribute depend on value presence for the cell.
@param column_on_class set class, which will be added to the tag if columns has value
@param column_off_class set class, which will be added to the tag if columns not has value
@param columns list of columns names, which values will be checked for set class attribute
@param invert - invert the adding class logic
@param read_only - check-on/off readOnly attribute for the tag
"""
Column.__init__(self, label, default, label_msgid)
self.column_on_class = column_on_class
self.column_off_class = column_off_class
self.columns = columns
self.invert = invert
self.read_only = read_only
def passCondition(self, row_data):
""" Return calculated class attribute."""
res = sum([1 for c in self.columns if row_data.get(c,0)])
return res == len(self.columns) and not self.invert
security.declarePublic('getAttributesData')
def getAttributesData(self, row_data):
""" Return calculated class attribute."""
res = {'style_class': None, 'read_only': None}
isPassCondition = self.passCondition(row_data)
if self.column_on_class or self.column_off_class:
res['style_class'] = isPassCondition and self.column_on_class or self.column_off_class
if self.read_only:
res['read_only'] = isPassCondition and True or False
return res
security.declarePublic('getMacro')
def getMacro(self):
""" Return macro used to render this column in view/edit """
return "referencedatagrid_block_cell"
# Initializes class security
InitializeClass(BlockColumn)
class StyledColumn(Column):
""" Column with styling based on events."""
security = ClassSecurityInfo()
def __init__(self, label, default=None, label_msgid=None,
trigger_key=None, blur_handler="", focus_handler="",
class_no="", class_changed="", class_not_changed=""):
""" Create a column
@param trigger_key
"""
Column.__init__(self, label, default, label_msgid)
self.trigger = trigger_key
self.blur_handler = blur_handler and blur_handler + "(event)" or ""
self.focus_handler = focus_handler and focus_handler + "(event)" or ""
self.class_no = class_no
self.class_not_changed = class_not_changed
self.class_changed = class_changed
security.declarePublic("getAttributes")
def getAttributes(self, column_id, rows):
default = None
blur_handler = None
focus_handler = None
sclass = self.class_no
if rows.has_key(self.trigger) \
and rows.has_key(column_id):
focus_handler = self.focus_handler
blur_handler = self.blur_handler
current = rows[column_id]
default = rows[self.trigger]
# if default is not epty string - than it is same to original value
if current == default:
sclass = self.class_not_changed
else:
sclass = self.class_changed
return {'class': sclass,
'onblur': blur_handler,
'onfocus': focus_handler,
'default': default}
security.declarePublic('getMacro')
def getMacro(self):
""" Return macro used to render this column in view/edit """
return "referencedatagrid_styled_cell"
# Initializes class security
InitializeClass(StyledColumn)