Code to import deputies from a dump of pfb mysql database

This commit is contained in:
Frédéric Péters 2011-09-15 09:12:46 +02:00
parent 74f503926d
commit de59716cfe
2 changed files with 121 additions and 0 deletions

View File

@ -14,4 +14,11 @@
permission="cmf.ManagePortal"
/>
<browser:view
name="importdeputies"
for="*"
class=".migration.ImportDeputies"
permission="cmf.ManagePortal"
/>
</configure>

View File

@ -4,7 +4,10 @@ import cPickle
import os
import datetime
import cStringIO
import xml.etree.ElementTree as ET
from zope.app.intid.interfaces import IIntIds
from z3c.relationfield import RelationValue
from Products.Five.browser import BrowserView
from Products.CMFCore.utils import getToolByName
from plone.dexterity.factory import DexterityFactory
@ -13,8 +16,17 @@ try:
from plone.namedfile.file import NamedBlobFile as NamedFile
except ImportError:
from plone.namedfile.file import NamedFile
try:
from plone.namedfile.file import NamedBlobImage as NamedImage
except ImportError:
from plone.namedfile.file import NamedImage
from Products.CMFCore.WorkflowCore import WorkflowException
from plone.registry.interfaces import IRegistry
from zope import component
from tabellio.config.interfaces import ITabellioSettings
class Migrate(BrowserView):
def __call__(self):
self.logfile = file('/tmp/migration.log', 'a+')
@ -281,3 +293,105 @@ class Migrate(BrowserView):
pass
return 'deputy:'+author_id
class ImportDeputies(BrowserView):
def __call__(self):
self.settings = component.getUtility(IRegistry).forInterface(ITabellioSettings, False)
self.portal = getToolByName(self.context, 'portal_url').getPortalObject()
self.plone_utils = getToolByName(self.context, 'plone_utils')
self.portal_workflow = getToolByName(self.context, 'portal_workflow')
self.intids = component.getUtility(IIntIds)
self.portal_types = getToolByName(self.context, 'portal_types')
path = self.request.form.get('path')
if not path:
path = '/tmp/Datas_pertinentes_sitePFBactu.xml'
base_picdir = os.path.join(os.path.dirname(path), 'pictures')
plone_tool = getToolByName(self.context, 'plone_utils')
doc = ET.parse(path)
# get mapping for political groups
polgroups = {}
for d in doc.findall('groupesPolitiques'):
polgroup_id = d.find('grpPolId').text
polgroup_name = d.find('grpPolName').text
polgroups[polgroup_id] = polgroup_name
for d in self.deputies_folder.objectValues():
d.active = False
# import deputies
for d in doc.findall('parlementaires'):
firstname = d.find('parlFirstName').text
lastname = d.find('parlLastName').text
parlname = u'%s %s' % (lastname, firstname)
parl_id = plone_tool.normalizeString(parlname)
if not hasattr(self.deputies_folder, parl_id):
print 'Created deputy:', firstname, lastname
self.deputies_folder.invokeFactory('themis.datatypes.deputy',
parl_id, firstname=firstname, lastname=lastname)
object = getattr(self.deputies_folder, parl_id)
day, month, year = d.find('parlBirthday').text.split('-')
object.active = True
object.birthdate = datetime.datetime(int(year), int(month), int(day))
object.birthplace = d.find('parlLocBirthDay').text
object.polgroup = RelationValue(self.get_polgroup_intid(
polgroups.get(d.find('grpPolId').text)))
pic_filename = d.find('parlPicture').text
pic_filepath = os.path.join(base_picdir, pic_filename)
if os.path.exists(pic_filepath):
fd = file(pic_filepath)
object.picture = NamedImage(fd.read(), filename=unicode(pic_filename))
fd.close()
_polgroups_folder = None
def polgroups_folder(self):
if self._polgroups_folder:
return self._polgroups_folder
path = self.settings.polgroupsPath
self._polgroups_folder = self.get_folder_at_path(path)
return self._polgroups_folder
polgroups_folder = property(polgroups_folder)
_polgroups_intids = None
def get_polgroup_intid(self, title):
if not self._polgroups_intids:
self._polgroups_intids = {}
if title in self._polgroups_intids:
return self._polgroups_intids.get(title)
polgroup_id = self.plone_utils.normalizeString(title)
if not hasattr(self.polgroups_folder, polgroup_id):
self.polgroups_folder.invokeFactory('themis.datatypes.polgroup', polgroup_id, title=title)
try:
self.portal_workflow.doActionFor(getattr(self.polgroups_folder, polgroup_id), 'publish')
except WorkflowException:
pass
polgroup_intid = self.intids.getId(getattr(self.polgroups_folder, polgroup_id))
self._polgroups_intids[title] = polgroup_intid
return polgroup_intid
_deputies_folder = None
def deputies_folder(self):
if self._deputies_folder:
return self._deputies_folder
path = self.settings.deputiesPath
self._deputies_folder = self.get_folder_at_path(path)
return self._deputies_folder
deputies_folder = property(deputies_folder)
def get_folder_at_path(self, path):
current = self.portal
for part in path.split('/'):
if not part:
continue
current = getattr(current, part)
return current