SolverDecision.py 5.08 KB
Newer Older
Jean-Paul Smets's avatar
Jean-Paul Smets committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved.
#                    Jean-Paul Smets-Solanes <jp@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
# garantees and support are strongly adviced 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.
#
##############################################################################

import zope.interface
from AccessControl import ClassSecurityInfo
Jean-Paul Smets's avatar
Jean-Paul Smets committed
32
from Products.ERP5Type import Permissions, PropertySheet, interfaces
Jean-Paul Smets's avatar
Jean-Paul Smets committed
33
from Products.ERP5Type.XMLObject import XMLObject
34
from Products.ERP5.mixin.configurable import ConfigurableMixin
Jean-Paul Smets's avatar
Jean-Paul Smets committed
35

36
class SolverDecision(ConfigurableMixin, XMLObject):
Jean-Paul Smets's avatar
Jean-Paul Smets committed
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
  """
    The goal of Solver Decision is to record the fact that
    "the user decided to solve a list of divergent delivery lines
    - which are divergent because of given divergence tester -
    by applying specific heuristic (target solver) and storing
    properties at a given level (ex. delivery vs. delivery line)."

    Every Solver Decision has a relation (delivery category) to a list of
    accountable Delivery Line or Cell (ie. not to an enclosing
    Delivery Line). Solver Decision specifies the heuristic to use
    through a relation to a single target solver portal type 
    (target_solver pgroup) using the "solver" base category.

    Every Solver Decision acquires the configuration properties
    of its related Target Solver. Configuration properties may include
    the choice of a Delivery Solver each time divergence is related
    to suantity.

    The level of application of the resolution is specified by specifying
    a relation to a list of "non accountable" movements (ex. delivery lines,
    deliveries) which enclose divergent accountable movements, using 
    base category XXX. (to be defined)

    TODO:
    - which base category is used to specify resolution application level ?
      (delivery ?)
  """
  meta_type = 'ERP5 Solver Decision'
  portal_type = 'Solver Decision'
  add_permission = Permissions.AddPortalContent
67
  isIndexable = 0 # We do not want to fill the catalog with objects on which we need no reporting
Jean-Paul Smets's avatar
Jean-Paul Smets committed
68 69 70 71 72 73 74 75 76 77 78

  # Declarative security
  security = ClassSecurityInfo()
  security.declareObjectProtected(Permissions.AccessContentsInformation)

  # Default Properties
  property_sheets = ( PropertySheet.Base
                    , PropertySheet.XMLObject
                    , PropertySheet.CategoryCore
                    , PropertySheet.DublinCore
                    , PropertySheet.SolverSelection
79
                    , PropertySheet.Configurable
Jean-Paul Smets's avatar
Jean-Paul Smets committed
80
                    )
81 82 83 84 85
  # XXX-JPS missing property sheet or categories to specify 
  #   (default)delivery or solver_application or order -> the object of application of resolution
  #         ie. a specified delivery, a specified delivery line, etc.
  #         (delivery should be enough)
  #   all property sheets of target solvers (with their configuration properties)
Jean-Paul Smets's avatar
Jean-Paul Smets committed
86 87 88 89

  # Declarative interfaces
  zope.interface.implements(interfaces.IConfigurable,
                           )
90 91 92 93 94 95 96

  def getDefaultConfigurationPropertyDict(self):
    """
    Returns a dictionary of default properties for specified
    configurable object
    (implementation)
    """
97 98
    solver_type = self.getSolverValue()
    if solver_type is None:
99
      return {}
100
    else:
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
101
      return solver_type.getDefaultConfigurationPropertyDict(self)
102 103 104 105 106 107

  def getExplanationMessage(self, all=False):
    """
    Returns the HTML message that describes the detail of divergences to
    be solved with this Solver Decision.
    """
108
    movement_list = self.getDeliveryValueList()
109 110
    message_list = []
    for tester in self.getCausalityValueList():
111 112 113 114 115 116 117 118 119 120
      for movement in movement_list:
        for simulation_movement in movement.getDeliveryRelatedValueList():
          message = tester.getExplanationMessage(simulation_movement)
          if message is None:
            continue
          if all or len(message_list) == 0:
            message_list.append(message)
          elif len(message_list) == 1:
            # XXX it should be a link to the detailed view.
            message_list.append('...')
121
    return ''.join(message_list)