[Erp5-report] r20238 - /erp5/trunk/products/ERP5/Tool/ContributionTool.py

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Mar 31 20:04:13 CEST 2008


Author: yusei
Date: Mon Mar 31 20:04:12 2008
New Revision: 20238

URL: http://svn.erp5.org?rev=20238&view=rev
Log:
Use portal_contribution_registry to find appropriate portal type.

Modified:
    erp5/trunk/products/ERP5/Tool/ContributionTool.py

Modified: erp5/trunk/products/ERP5/Tool/ContributionTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Tool/ContributionTool.py?rev=20238&r1=20237&r2=20238&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Tool/ContributionTool.py (original)
+++ erp5/trunk/products/ERP5/Tool/ContributionTool.py Mon Mar 31 20:04:12 2008
@@ -99,90 +99,6 @@
 
   security.declareProtected(Permissions.ManagePortal, 'manage_overview' )
   manage_overview = DTMLFile( 'explainContributionTool', _dtmldir )
-
-  security.declarePrivate('findTypeName')
-  def findTypeName(self, file_name, document, container=None):
-    """
-      Finds the appropriate portal type based on the file name
-      or if necessary the content of the document.
-
-      Configuration Scripts:
-
-       - Document_findTypeName: receives file name and valid portal type list,
-         and find more appropriate portal type for the current context document.
-         By default, first, this script will find a portal type from file name
-         and next, this will find it from content of the current document.
-
-         You can configure this script in order to define another search order.
-         (e.g. find portal type from content first)
-
-      NOTE: XXX This implementation can be greatly accelerated by
-      caching a dict resulting which combines getContentTypeRegistryTypeDict
-      and valid_portal_type_list
-    """
-    def getContentTypeRegistryTypeDict():
-      result = {}
-      for id, pred in self.content_type_registry.listPredicates():
-        (p, type) = pred
-        result[type] = None
-      return result
-
-    portal_type = None
-    # We should only consider those portal_types which share the
-    # same constructor with the current object and which are not
-    # part of the definitions of content_type_registry. For
-    # example if content type registry has a definition for
-    # RSS feed, then there is no reason to consider this type
-    # whenever receiving some text/html content although both
-    # types share the same constructor. However, if Memo has
-    # same constructor as Text and Memo is not in content_type_registry
-    # then it should be considered.
-    extra_valid_portal_type_list = []
-    content_registry_type_dict = getContentTypeRegistryTypeDict()
-    portal_type_tool = self.portal_types
-    for pt in portal_type_tool.objectValues():
-      if hasattr(pt, 'factory') and pt.factory == portal_type_tool[document.getPortalType()].factory:
-        if not content_registry_type_dict.has_key(pt.id):
-          extra_valid_portal_type_list.append(pt.id)
-
-    if not extra_valid_portal_type_list:
-      # There is really no ambiguity here
-      # The portal_type set by PUT_factory is appropriate
-      # This is the best case we can get
-      # LOG('findTypeName no ambiguity', 0, document.portal_type)
-      return document.portal_type
-
-    valid_portal_type_list = [document.portal_type] + extra_valid_portal_type_list
-    # LOG('valid_portal_type_list', 0, str(valid_portal_type_list))
-
-    # If a container is defined, filter valid portal types with allowedContentTypes
-    if container is not None:
-      allowed_type_list = map(lambda x: x.id, container.allowedContentTypes())
-      # LOG('allowed_type_list', 0, str(allowed_type_list))
-      valid_portal_type_list = filter(lambda x: x in allowed_type_list, valid_portal_type_list)
-      # LOG('filtered valid_portal_type_list', 0, str(valid_portal_type_list))
-
-    # Check if there is any intersection with index portal types
-    # If not, we do not need to even check if content is an index
-    is_index_candidate = False
-    for index_type in self.getPortalCrawlerIndexTypeList():
-      if index_type in valid_portal_type_list:
-        is_index_candidate = True
-        candidate_index_type = index_type
-
-    if is_index_candidate and document.isIndexContent(container=container):
-      # If this document has to be created inside an External Source (container)
-      # we need to analyse its content to determine whether it is or not
-      # an index document. Index documents should not be searchable as documents
-      # and should not be considered in the depth calculation of the crawling 
-      # process
-      return candidate_index_type # We suppose that there is only one index type in allowed content types
-
-    method = document._getTypeBasedMethod('findTypeName',
-                                          fallback_script_id='Document_findTypeName')
-    portal_type = method(file_name, valid_portal_type_list)
-    if portal_type in valid_portal_type_list:
-      return portal_type
 
   security.declareProtected(Permissions.AddPortalContent, 'newContent')
   def newContent(self, id=None, portal_type=None, url=None, container=None,
@@ -326,7 +242,7 @@
         extension = '.%s' % file_name.split('.')[-1]
       file_name = '%s%s' % (self.generateNewId(), extension)
 
-    ob = self.PUT_factory(file_name, mime_type, None)
+    ob = self.PUT_factory(file_name, mime_type, data)
 
     # Raise an error if we could not guess the portal type
     if ob is None:
@@ -340,6 +256,12 @@
     # Then put the file inside ourselves for a short while
     BaseTool._setObject(self, object_id, ob)
     document = BaseTool._getOb(self, object_id)
+
+    rewrite_method = document._getTypeBasedMethod('rewriteIngestionData')
+    if rewrite_method is not None:
+      modified_kw = rewrite_method(**kw.copy())
+      if modified_kw is not None:
+        kw.update(modified_kw)
 
     try:
       # Then edit the document contents (so that upload can happen)
@@ -461,13 +383,7 @@
       # portal_type based on the document content
       # (ex. a Memo is a kind of Text which can be identified
       # by the fact it includes some specific content)
-      portal_type = self.findTypeName(name, ob.__of__(self), container=container)
-      if portal_type is None: portal_type = ob.portal_type
-      ob._setPortalTypeName(portal_type) # This is redundant with finishConstruction
-                                       # but necessary to move objects to appropriate
-                                       # location based on their content. Since the
-                                       # object is already constructed here, we
-                                       # can safely change its portal_type
+
       # Now we know the portal_type, let us find the module
       # to which we should move the document to
       if container is None:




More information about the Erp5-report mailing list