[Erp5-report] r11096 - in /erp5/trunk/products/ERP5Type: Constraint/ Interface/

nobody at svn.erp5.org nobody at svn.erp5.org
Sun Nov 5 10:38:34 CET 2006


Author: jerome
Date: Sun Nov  5 10:38:32 2006
New Revision: 11096

URL: http://svn.erp5.org?rev=11096&view=rev
Log:
Added an interface for Constraint, today's open questions are marqued by XXX 


Added:
    erp5/trunk/products/ERP5Type/Interface/Constraint.py
Modified:
    erp5/trunk/products/ERP5Type/Constraint/Constraint.py

Modified: erp5/trunk/products/ERP5Type/Constraint/Constraint.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Constraint/Constraint.py?rev=11096&r1=11095&r2=11096&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Constraint/Constraint.py (original)
+++ erp5/trunk/products/ERP5Type/Constraint/Constraint.py Sun Nov  5 10:38:32 2006
@@ -29,11 +29,13 @@
 ##############################################################################
 
 from Products.CMFCore.Expression import Expression
+from Products.ERP5Type.Interface import Constraint as IConstraint
 
 class Constraint:
     """
       Default Constraint implementation
     """
+    __implements__ = (IConstraint, )
 
     def __init__(self, id=None, description=None, type=None,
                  condition=None, **constraint_definition):

Added: erp5/trunk/products/ERP5Type/Interface/Constraint.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Interface/Constraint.py?rev=11096&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Type/Interface/Constraint.py (added)
+++ erp5/trunk/products/ERP5Type/Interface/Constraint.py Sun Nov  5 10:38:32 2006
@@ -1,0 +1,107 @@
+##############################################################################
+#
+# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved.
+#                    Jerome Perrin <jerome at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly advised to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+try:
+    from Interface import Interface
+except ImportError:
+    # for Zope versions before 2.6.0
+    from Interface import Base as Interface
+
+class Constraint(Interface):
+  """ERP5 Constraints are classes that are in charge of checking wether an
+  object is in consistent state or not.
+
+  Constraints are usually defined in PropertySheets, thus constraints are
+  associated to all documents of a given portal type.
+  
+  A property sheet can contain _constraints slot ( just like _properties and
+  _categories ).  _constraints is a list of constraint definition represented
+  as dictionnaries, for example we can have:
+
+  _constraints = (
+    {   # we need to have an id
+        'id': 'the_constraint',
+        
+        # Specify the class name of the constraint. The class name must be
+        # registered to ERP5Type. If the class is not found, a
+        # ConstraintNotFound error will be raised when trying to use it.
+        'type': 'MyConstraintClass',
+      
+        # Constraint have a description.
+        # XXX today, this is used to present errors to the user, because it's
+        # the only thing we can translate because it's static, wether other
+        # messages are dynamic.
+        'description': 'Constraint description', 
+       
+        # XXX condition is a TALES Expression; is it part of the API ?
+        # how to use condition based on a workflow state in a workflow before
+        # script, where the document is not in that state yet ?
+        'condition': 'python: object.getPortalType() == "Foo"'
+
+        # Additional Constraint parameters are configured here.
+        # Constraint docstring should provide a configuration example and a
+        # documentation on parameter they accept.
+    }
+  )
+
+  Those constraint definition parameters will be available from the Constraint
+  instance as `self.constraint_definition` (a dict).
+
+  Calling checkConsistency() method on any ERP5Type document will check all
+  constraint defined on an object.
+    
+  XXX How to call only one constraint, even if this constraint is not defined
+  on property sheet ?
+
+  """
+  
+  def checkConsistency(obj, fixit=0):
+    """This method checks the consistency of object `obj`, and fix errors if
+    the argument `fixit` is true. Not all constraint have to support error
+    repairing, in that case, simply ignore the fixit parameter.
+    This method should return a list of errors, which are a list for now.
+    """
+    
+  def _generateError(obj, error_message):
+    """Generate an error for `obj` with the corresponding `error_message`.
+    This method is usefull for Constraint authors, in case of an error, they
+    can simply call:
+    
+    >>> if something_is_wrong:
+    >>>   errors.append(self._generateError(obj, 'Something is wrong !')
+    
+    It's also possible to use a Message for dynamic translation:
+    >>> if something_is_wrong:
+    >>>   errors.append(self._generateError(obj, Message('erp5_ui', 
+    ...     'Something is wrong: ${wrong_thing}',
+    ...      mapping=dict(wrong_thing=obj.getTheWrongThing()))))
+   
+    XXX it's probably not possible today, but it would be great to be able to
+    use Message here.
+    """
+




More information about the Erp5-report mailing list