From cb57c3b092ce7bf190fd39d3fcd7006fb3da259c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Fri, 3 May 2013 15:25:59 +0200 Subject: [PATCH] add a new @@fileimport endpoint, to be used by external batch processing tools --- .../dms/batchimport/fileimporter.py | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/collective/dms/batchimport/fileimporter.py diff --git a/src/collective/dms/batchimport/fileimporter.py b/src/collective/dms/batchimport/fileimporter.py new file mode 100644 index 0000000..9758f05 --- /dev/null +++ b/src/collective/dms/batchimport/fileimporter.py @@ -0,0 +1,95 @@ +import logging +import os +import os.path + +from zope import schema +from zope.component import queryUtility +from five import grok +from Products.CMFPlone.interfaces import IPloneSiteRoot +from Products.CMFCore.utils import getToolByName + +import z3c.form.button +from plone.directives import form +from plone.i18n.normalizer.interfaces import IIDNormalizer + +from collective.dms.mailcontent.dmsmail import internalReferenceIncomingMailDefaultValue, receptionDateDefaultValue + +from plone.namedfile.field import NamedFile, NamedBlobFile + +from . import _ + +log = logging.getLogger('collective.dms.batchimport') + +class IImportFileFormSchema(form.Schema): + file = NamedBlobFile(title=_(u"File")) + + title = schema.Text(required=False) + portal_type = schema.Text(required=False) + location = schema.Text(required=False) + owner = schema.Text(required=False) + + +class ImportFileForm(form.SchemaForm): + schema = IImportFileFormSchema + + # Permission required to + grok.require("cmf.ManagePortal") + + ignoreContext = True + + grok.context(IPloneSiteRoot) + + # appear as @@fileimport view + grok.name("fileimport") + + def get_folder(self, foldername): + folder = getToolByName(self.context, 'portal_url').getPortalObject() + for part in foldername.split('/'): + if not part: + continue + folder = getattr(folder, part) + return folder + + def convertTitleToId(self, title): + """Plug into plone's id-from-title machinery. + """ + #title = title.decode('utf-8') + newid = queryUtility(IIDNormalizer).normalize(title) + return newid + + @z3c.form.button.buttonAndHandler(_('Import'), name='import') + def import_file(self, action): + # Extract form field values and errors from HTTP request + data, errors = self.extractData() + if errors: + self.status = self.formErrorsMessage + return + + portal_type = data['portal_type'] + filename = data['file'].filename + owner = data['owner'] + folder = self.get_folder(data['location']) + + metadata = {} + document_id = self.convertTitleToId(os.path.splitext(filename)[0]) + if data.get('title'): + document_title = data.get('title') + else: + document_title = document_id + + if portal_type == 'dmsincomingmail': + metadata['internal_reference_no'] = internalReferenceIncomingMailDefaultValue(self) + metadata['reception_date'] = receptionDateDefaultValue(self) + + log.info('creating the document for real (%s)' % document_id) + folder.invokeFactory(portal_type, id=document_id, title=document_title, + **metadata) + + document = folder[document_id] + document.invokeFactory('dmsmainfile', id='main', title=_(u'Main File'), file=data['file']) + + mt = getToolByName(self.context, 'portal_membership') + member = mt.getMemberById(owner) + document.setCreators([owner]) + document.manage_setLocalRoles(owner, ['Owner', 'Editor']) + document.reindexObjectSecurity()