[Erp5-report] r20225 - /erp5/trunk/products/ERP5Form/Extensions/

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Mar 31 14:22:06 CEST 2008


Author: fabien
Date: Mon Mar 31 14:22:05 2008
New Revision: 20225

URL: http://svn.erp5.org?rev=20225&view=rev
Log:
initial import of the Extension ERP5Site_updateModuleScribus.py that permit to
update the forms of a module created using erp5_pdf_editor module and scribus
file.

Added:
    erp5/trunk/products/ERP5Form/Extensions/ERP5Site_updateModuleScribus.py

Added: erp5/trunk/products/ERP5Form/Extensions/ERP5Site_updateModuleScribus.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/Extensions/ERP5Site_updateModuleScribus.py?rev=20225&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Form/Extensions/ERP5Site_updateModuleScribus.py (added)
+++ erp5/trunk/products/ERP5Form/Extensions/ERP5Site_updateModuleScribus.py Mon Mar 31 14:22:05 2008
@@ -1,0 +1,410 @@
+##############################################################################
+#
+# Copyright (c) 2008 Nexedi SA and Contributors. All Rights Reserved.
+#               Fabien Morin <fabien 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
+# 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.
+#
+##############################################################################
+
+def ERP5Site_updateModuleScribus(self,
+                                 import_pdf_file=None,
+                                 import_scribus_file=None,
+                                 option_html=None,
+                                 desired_width=None,
+                                 desired_height=None,
+                                 object_portal_type=None,
+                                 selection_index=None,
+                                 selection_name=None,
+                                 **kw):
+  """ Update the ERP5Form, scribus, PDFForm, css and background picture created 
+      from scribus and PDFForm file"""
+  context = self
+
+  # IMPORTING MODULES
+  from Products.Formulator.Errors import ValidationError, FormValidationError
+  from Products.ERP5Form.ScribusUtils import ScribusParser
+  from Products.ERP5Form.ScribusUtils import ManageModule
+  from Products.ERP5Form.ScribusUtils import ManageFiles
+  from Products.ERP5Form.ScribusUtils import ManageCSS
+  from Products.ERP5Form.CreatePropertySheet import LocalGenerator
+  # importing module to get an access to the 'searchFolder' method
+  # needed to be able to list the objects in 'list_object_view' form
+  from Products.ERP5.ERP5Site import ERP5Site
+  from Products.CMFCore.utils import getToolByName
+  from zLOG import LOG, TRACE, WARNING, ERROR, INFO
+
+  # CREATING MODULES INSTANCES
+  ScribusParser = ScribusParser()
+  ManageModule = ManageModule()
+  ManageFiles = ManageFiles()
+  ManageCSS = ManageCSS()
+  generator = LocalGenerator()
+
+  # DECLARING VARIABLES
+  def_lineNumberInList = 20 # JPS-XXX - hardcoded
+  def_colorRequired = 'rgb(192,192,255)' # JPS-XXX - hardcoded
+  def_colorRequiredError = 'rgb(128,128,255)' # JPS-XXX - hardcoded
+  def_color = '#F6FFFF' # JPS-XXX - hardcoded
+  def_colorError = 'rgb(255,64,64)' # JPS-XXX - hardcoded
+
+  # recovering objects
+  portal = context.getPortalObject()
+  portal_types = portal.portal_types
+  object_portal_type_id = object_portal_type
+  desired_height = desired_height
+  desired_width = desired_width
+  resolution = 300 # JPS-XXX - hardcoded
+  background_format = 'jpg' # XXX - hardcoded
+  space_between_pages = 20 # XXX - hardcoded
+  option_html = option_html
+
+  # get object_title and portal_skin object using the object_portal_type
+  # to search the view in portal_skins folder
+  search_param = {
+                  'obj_metatypes': 'ERP5 Form',
+                  'obj_searchterm': '%s_view' % object_portal_type,
+                  'search_sub': 1
+                 }
+  result = portal.portal_skins.PrincipiaFind( portal.portal_skins, 
+                                              **search_param)
+  
+  # keep only the object in the "good" skinFolder
+  good_result = {}
+  for path, ob in result:
+    if portal.portal_skins.isFirstInSkin(path):
+      good_result[path]=ob
+
+  # We should have only one result
+  if len(good_result) > 1:
+    raise ValueError, "Error: There is more than one result for the "\
+                            "view '%s_view'" % object_portal_type
+  elif len(good_result) < 1:
+    raise ValueError, "Error: There is no result for the view "\
+                            "'%s_view'" % object_portal_type
+
+  # use the result to get the object_title and portal_skin folder
+  object_result = good_result.items()[0][1]
+  object_path = object_result.absolute_url_path().replace(object_result.id, '')
+  portal_skins_folder = object_result.aq_parent.getId()
+  object_title = object_result.getId()
+
+  # DECLARING NAMES
+  # declaring names for ERP5 objects, such as Form, DTML Document, etc.
+  # these names are stored in a dict (object_names)
+  object_names = ManageModule.setObjectNames(object_portal_type_id,
+                                             object_title)
+
+  # PROCESSING SKIN FOLDER
+  # get the skin_folder object
+  if not portal_skins_folder in portal.portal_skins.objectIds():
+    # the skin folder should exists
+    raise ValueError, "Error: portal_skins %s not found" % \
+        portal_skins_folder 
+  skin_folder = ManageModule.setSkinFolder(portal,
+                                           portal_skins_folder)
+
+  # all object in the skin_folder should be re-generated to be updated
+  # except the module form view (because it don't change)
+  object_id_list = []
+  for object in skin_folder._objects:
+    if 'Module_view' not in object['id']:
+      object_id_list.append(object['id'])
+
+  # move the old objects in portal_trash
+  trash = getToolByName(self.getPortalObject(), 'portal_trash', None)
+  if trash is None: 
+    raise AttributeError, 'Trash Tool is not installed'
+
+  trashbin = trash.newTrashBin(bt_title='scribus_skin_folder_%s' % \
+      skin_folder.getId())
+  container_path = list(skin_folder.getPhysicalPath()[1:])
+  # backup all objects before delete them
+  for object_id in object_id_list:
+    trash.backupObject(trashbin, container_path,
+      object_id, save=1, keep_subobjects=1)
+  # delete objects after backup
+  skin_folder.manage_delObjects(object_id_list)
+
+  # ERP FORM LIST PROCESSING
+  # Create ERP5 Form in order to view the module
+  # set up the factory based on skin_folder
+  factory = skin_folder.manage_addProduct['ERP5Form']
+
+  # INIT ATTRIBUTES DICT
+  # global_properties is a special dict destinated to
+  # keep all the field and page data safe during the
+  # parsing, allowing them to be updated when needed
+  # and used if necessary.
+  global_properties = ScribusParser.initFieldDict()
+
+
+  # PARSER VARIABLES DECLARATION
+  # the following variable will recover the final CSS
+  # file's content object (string) before saving it
+  # onto the hard disk
+  form_css_content = ""
+  # properties_css_dict is used to store class informations
+  properties_css_dict = {}
+  # init page number
+  page_number_int = 0
+  scale_factor = 0
+  # import scribus file
+  # take the input ScribusFile and read the content
+  xml_string = ScribusParser.getContentFile(import_scribus_file)
+  if xml_string == None:
+    LOG('ERP5Site_updateModuleScribus', WARNING, 
+        'no field was defined in the Scribus file')
+    pass
+  else:
+
+    # GETTING FULL SCRIBUS DOCUMENT PROPERTIES
+    # get string from ScribusFile content
+    output_string = str(xml_string)
+
+    LOG('ERP5Site_updateModuleScribus', INFO, 
+        'createmodule > ScribusParser.getXmlObjectPropertiesDict')
+    # building a tree from the output string elaborated from the
+    # original Scribus file.
+    # create a list of pages containing a dict of all the page_objects
+    # elements with their attributes 'as they are' (so without any check
+    # for data integrity or unuseful values).
+    # This procedure already makes a selection of parameters and take all the
+    # unnecessary page_objects off.
+    #import pdb
+    #pdb.set_trace()
+    (text_field_list, keep_page, page_gap) = \
+        ScribusParser.getXmlObjectsPropertiesDict(xml_string)
+    LOG('ERP5Site_updateModuleScribus', INFO, 
+        'createmodule < ScribusParser.getXmlObjectPropertiesDict')
+
+
+    LOG('ERP5Site_updateModuleScribus', INFO, 
+        'createmodule > ScribusParser.getPropertiesConversionDict')
+    # parsing text_field_list created from the getXmlObjectsPropertiesDict
+    # to extract all the usefull properties and organize elements. Then check
+    # attributes to get properties values.
+    # This represents the main process of the script.
+    widget_properties = \
+        ScribusParser.getPropertiesConversionDict(text_field_list)
+
+    LOG('ERP5Site_updateModuleScribus', INFO, 
+        'createmodule < ScribusParser.getPropertiesConversionDict')
+
+
+    # testing if final rendering is PDF-like
+    if option_html == 1:
+      LOG('ERP5Site_updateModuleScribus', INFO, 
+          'createmodule > generating background')
+      ## BACKGROUND GENERATOR
+      # extract background pictures from the PDF document, convert them in the right
+      # format (JPG) and add them to the skin folder as Image objects.
+      # used only with option_html == 1
+      # recover image_size
+      image_size = ManageFiles.setBackgroundPictures(import_pdf_file,
+          object_names, skin_folder, desired_height, desired_width,
+          resolution, background_format)
+
+      page_width, page_height = image_size
+
+      LOG('ERP5Site_updateModuleScribus', INFO,
+          '   height = %s' % str(page_height))
+      LOG('ERP5Site_updateModuleScribus', INFO,
+          '   width = %s' % str(page_width))
+      LOG('ERP5Site_updateModuleScribus', INFO, 
+          'createmodule < background generated')
+
+    # add field from OrderedWidgetProperties in ERP5 Module created
+    # radiofield_widget_properties = {}
+    position = {}
+    # personal_properties_list is used to create PropertySheet
+    personal_properties_list = []
+
+    # recovering number of pages
+    global_properties['page'] = len(widget_properties)
+
+    # CSS FILE INIT
+    # init the CSS dict by creating sub-dicts to store various information
+    # i.e : 'head', 'standard' ,'error', etc.
+    # these sub-dicts are stored in the properties_css_dict
+    properties_css_dict = ManageCSS.setInit()
+
+    # BEGINING DATA INTERPRETATION
+    LOG('ERP5Site_updateModuleScribus', INFO, 
+        'createmodule > begining data interpretation')
+    #iterating pages
+    #print "   %s" % int(global_properties['page'])
+    for page_iterator in range(int(global_properties['page'])):
+      page_number = str(page_iterator)
+      page_content = widget_properties[page_number]
+      page_id = "page_" + page_number
+
+      if option_html == 1:
+        # CSS PAGE DEFINITION (PAGE AND BACKGROUND IMAGE)
+        # get CSS class properties relative to the actual page
+        # (background picture position, picture size, etc.)
+        # and add them to the css dict
+        width_groups, height_groups = ManageFiles.getPageattributes(
+                                              global_properties,
+                                              import_pdf_file)
+        properties_css_dict, properties_page = \
+            ManageCSS.setPageProperties(properties_css_dict,
+                                        page_iterator,
+                                        page_id,
+                                        page_height,
+                                        page_width,
+                                        width_groups,
+                                        height_groups)
+
+      # RESUME DATA INTERPRETATION
+      # iterating pageobjects in page
+      for index in range(len(page_content)):
+        (id, properties_field) = page_content[index]
+        # testing each page_content
+        if properties_field.has_key('type'):
+
+          if option_html == 1:
+            # CSS FIELD PROPERTIES
+            # get CSS class properties related to the actual page_object
+            # in the page (position, size, color, etc.) and add them to
+            # the css_dict
+            properties_css_dict = ManageCSS.setFieldProperties(
+                                            properties_css_dict,
+                                            page_content[index],
+                                            page_width,
+                                            page_height,
+                                            page_iterator,
+                                            page_gap,
+                                            keep_page,
+                                            properties_page,
+                                            space_between_pages)
+
+
+          # recover useful page_object attributes from scribus dict
+          # to be able to create and update correctly the fields
+          # composing the form
+
+          ScribusParser.getFieldAttributes(page_content[index],
+                                           option_html,
+                                           page_id,
+                                           global_properties)
+
+    # CSS CLASS (generateOutputContent)
+    if option_html == 1:
+
+      # add last properties to css dict, including implementation
+      # of a n+1 page to prevent bug when rendering under Konqueror
+      ManageCSS.setFinalProperties(properties_css_dict, page_height,
+                                   space_between_pages)
+
+      # generate output string from dict
+      form_css_content = ManageCSS.generateOutputContent(properties_css_dict)
+
+      # save CSS string content into ERP5
+      ManageFiles.setCSSFile(factory, object_names['css'], form_css_content)
+
+
+  # CREATING OBJECT FORM AND MANAGING GROUPS
+  LOG('ERP5Site_updateModuleScribus', INFO,
+      'createmodule > generate fields in ERP Form')
+  # CREATING ERP5 OBJECT FORM
+  # create ERP5 Form to handle object view
+  ManageFiles.setERP5Form(factory,
+                          object_names['view_id'],
+                          object_title)
+
+  # update Form groups to have right number of groups with
+  # corresponding names (depending on the kind of display)
+  default_groups = ManageModule.setObjectForm(skin_folder,
+                                              object_names,
+                                              option_html,
+                                              global_properties,
+                                              object_portal_type)
+
+  # create fields corresponding to the page_objects
+  # recovered from the scribus file
+
+  ManageModule.setFieldsInObjectForm(skin_folder,
+                                     object_names,
+                                     default_groups,
+                                     global_properties,
+                                     option_html
+                                     )
+
+  LOG('ERP5Site_updateModuleScribus', INFO, 
+      'createmodule < fields created in ERP5 Form')
+
+
+
+  # PDF IMPORTATION AND TALES GENERATION
+  LOG('ERP5Site_updateModuleScribus', INFO, 
+      'createmodule > managing PDF settings')
+  # read all the content of the PDF document and save it in the skin_folder
+  # as a PDFForm. then iterate the fields to get the corresponding TALES
+  # expressions and save them in the PDFForm.
+  ManageFiles.setPDFForm(factory,
+                         skin_folder,
+                         object_names,
+                         object_title,
+                         pdf_file=import_pdf_file
+                         )
+  LOG('ERP5Site_updateModuleScribus', INFO, 
+      'createmodule < PDF settings managed')
+
+
+
+  # PROPERTYSHEET AND DOCUMENT CREATION
+
+  LOG('ERP5Site_updateModuleScribus', INFO, 
+      'createmodule > PropertySheet and Document creation')
+  # recover personal properties and save them in a PropertySheet
+  # then create the Document related to the object
+  ManageFiles.setPropertySheetAndDocument(global_properties,
+                                          object_portal_type,
+                                          generator,
+                                          skin_folder,
+                                          object_names)
+  # as new document and PropertySheet are created, it is needed to reload the
+  # registry.
+  from Products.ERP5Type.Utils import initializeLocalPropertySheetRegistry
+  initializeLocalPropertySheetRegistry()
+  from Products.ERP5Type.Utils import initializeLocalDocumentRegistry
+  initializeLocalDocumentRegistry()
+  LOG('ERP5Site_updateModuleScribus', INFO, 
+      'createmodule < PropertySheet and Document imported')
+
+
+  # manage redirection URL
+  if not selection_index:
+    redirect_url = '%s/view?%s' % (portal.absolute_url(),
+                                   'portal_status_message=Module+Updated.'
+                                  )
+  else:
+    redirect_url = '%s/view?selection_index=%s&selection_name=%s&%s' % (
+                            portal.absolute_url(),
+                            selection_index,
+                            selection_name,
+                            'portal_status_message=Module+Updated.'
+                            )
+
+  # redirect
+  portal.REQUEST.RESPONSE.redirect(redirect_url )




More information about the Erp5-report mailing list