IdTool.py 3.38 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 32 33 34 35 36 37 38 39 40 41 42
##############################################################################
#
# Copyright (c) 2002 Nexedi SARL and Contributors. All Rights Reserved.
#                    Sebastien Robin <seb@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.
#
##############################################################################

from Products.CMFCore.utils import UniqueObject

from AccessControl import ClassSecurityInfo
from Globals import InitializeClass, DTMLFile, PersistentMapping
from Products.ERP5Type.Document.Folder import Folder
from Products.ERP5Type import Permissions

from Products.ERP5 import _dtmldir

import threading

from zLOG import LOG

class IdTool(UniqueObject, Folder):
Vincent Pelletier's avatar
Vincent Pelletier committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
  """
    This tools handles the generation of IDs.
  """
  id = 'portal_ids'
  meta_type = 'ERP5 Id Tool'
  portal_type = 'Id Tool'
  allowed_types = ( 'ERP5 Order Rule', 'ERP5 Transformation Rule',)

  # Declarative Security
  security = ClassSecurityInfo()

  #
  #   ZMI methods
  #
  manage_options = ( ( { 'label'      : 'Overview'
                       , 'action'     : 'manage_overview'
                       }
                     ,
Jean-Paul Smets's avatar
Jean-Paul Smets committed
61
                     )
Vincent Pelletier's avatar
Vincent Pelletier committed
62 63
                   + Folder.manage_options
                   )
Jean-Paul Smets's avatar
Jean-Paul Smets committed
64

Vincent Pelletier's avatar
Vincent Pelletier committed
65 66
  security.declareProtected( Permissions.ManagePortal, 'manage_overview' )
  manage_overview = DTMLFile( 'explainIdTool', _dtmldir )
Jean-Paul Smets's avatar
Jean-Paul Smets committed
67

Vincent Pelletier's avatar
Vincent Pelletier committed
68 69 70
  # Filter content (ZMI))
  def __init__(self):
    return Folder.__init__(self, IdTool.id)
Jean-Paul Smets's avatar
Jean-Paul Smets committed
71
        
Vincent Pelletier's avatar
Vincent Pelletier committed
72 73 74
  # Filter content (ZMI))
  def generateNewId(self, id_group=None, default=None, method=None):
    """
Jean-Paul Smets's avatar
Jean-Paul Smets committed
75
      Generate a new Id
Vincent Pelletier's avatar
Vincent Pelletier committed
76
    """
77 78
    
    if getattr(self, 'dict_ids', None) is None:
Vincent Pelletier's avatar
Vincent Pelletier committed
79 80 81 82 83 84 85 86 87
      self.dict_ids = PersistentMapping()

    new_id = None
    if id_group is not None and id_group!='None':
      # Getting the last id
      last_id = None
      l = threading.Lock()
      l.acquire()
      try:
88 89 90 91 92 93 94 95 96
        class Dummy:
          pass
        dummy = Dummy()
        last_id = self.dict_ids.get(id_group, dummy)
        if last_id is dummy:
          if default is None:
            new_id=0
          else:
            new_id=default
Vincent Pelletier's avatar
Vincent Pelletier committed
97 98

        else:
99 100 101 102 103
          # Now generate a new id
          if method is not None:
            new_id = method(last_id)
          else:
            new_id = last_id + 1
Vincent Pelletier's avatar
Vincent Pelletier committed
104 105 106 107 108 109 110
 
        # Store the new value
        self.dict_ids[id_group] = new_id
      finally:
        l.release()

    return new_id
Jean-Paul Smets's avatar
Jean-Paul Smets committed
111 112

InitializeClass(IdTool)