factoring code, using settings from tabellio.config

This commit is contained in:
Frédéric Péters 2011-08-09 19:02:33 +02:00
parent 8b8b72366a
commit f9c06e30d5
3 changed files with 148 additions and 28 deletions

View File

@ -26,6 +26,10 @@ setup(name='tabellio.pcfdb',
install_requires=[
'setuptools',
# -*- Extra requirements: -*-
'tabellio.config',
'themis.datatypes',
'z3c.relationfield',
'z3c.sqlalchemy',
],
entry_points="""
# -*- Entry points: -*-

View File

@ -9,9 +9,30 @@
<browser:view
name="sync_deputies_from_pcfdb"
for="*"
for="Products.CMFPlone.interfaces.IPloneSiteRoot"
class=".sync.SyncDeputiesFromPcfDbView"
permission="cmf.ManagePortal"
/>
<browser:view
name="sync_commissions_from_pcfdb"
for="Products.CMFPlone.interfaces.IPloneSiteRoot"
class=".sync.SyncCommissionsFromPcfDbView"
permission="cmf.ManagePortal"
/>
<browser:view
name="sync_documents_from_pcfdb"
for="Products.CMFPlone.interfaces.IPloneSiteRoot"
class=".sync.SyncDocumentsFromPcfDbView"
permission="cmf.ManagePortal"
/>
<browser:view
name="sync_dossiers_from_pcfdb"
for="Products.CMFPlone.interfaces.IPloneSiteRoot"
class=".sync.SyncDossiersFromPcfDbView"
permission="cmf.ManagePortal"
/>
</configure>

View File

@ -7,15 +7,75 @@ from zope import component
from zope.app.intid.interfaces import IIntIds
from z3c.relationfield import RelationValue
class SyncDeputiesFromPcfDbView(BrowserView):
def __call__(self):
portal = getToolByName(self.context, 'portal_url').getPortalObject()
plone_tool = getToolByName(self.context, 'plone_utils')
intids = component.getUtility(IIntIds)
workflowTool = getToolByName(self.context, 'portal_workflow')
from plone.registry.interfaces import IRegistry
c = portal.db._wrapper.connection
cursor = c.cursor()
from tabellio.config.interfaces import ITabellioSettings
class SyncFromPcfDbView(BrowserView):
def setup(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.intids = component.getUtility(IIntIds)
self.portal_workflow = getToolByName(self.context, 'portal_workflow')
self.portal_types = getToolByName(self.context, 'portal_types')
def db_connection(self):
return self.portal.db._wrapper.connection
db_connection = property(db_connection)
def get_folder_at_path(self, path):
current = self.portal
for part in path.split('/'):
if not part:
continue
current = getattr(self.portal, part)
return current
_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)
_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(polgroupdir, 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
class SyncDeputiesFromPcfDbView(SyncFromPcfDbView):
def __call__(self):
self.setup()
cursor = self.db_connection.cursor()
cursor.execute('''SELECT t_pers.id, t_pers.nom, prenom, sexe, datenaiss, t_comppol.abbr, t_arrond.nom
FROM t_pers, t_pershistoline, t_comppol, t_parl, t_arrond
WHERE t_pers.st = 'S_PARL' and
@ -35,34 +95,69 @@ class SyncDeputiesFromPcfDbView(BrowserView):
break
pers_id, lastname, firstname, sex, birthdate, polgroup, district = row
fullname = '%s %s' % (firstname, lastname)
new_id = plone_tool.normalizeString(fullname)
if not hasattr(self.context, new_id):
self.context.invokeFactory('themis.datatypes.deputy', new_id,
new_id = self.plone_utils.normalizeString(fullname)
if not hasattr(self.deputies_folder, new_id):
self.deputies_folder.invokeFactory('themis.datatypes.deputy', new_id,
firstname=firstname, lastname=lastname)
object = getattr(self.context, new_id)
object = getattr(self.deputies_folder, new_id)
object.firstname = firstname
object.lastname = lastname
object.sex = sex
object.birthdate = birthdate
object.district = district
if not polgroup in polgroup_ids:
polgroup_id = plone_tool.normalizeString(polgroup)
polgroupdir = getattr(portal, 'groupes-politiques')
if not hasattr(polgroupdir, polgroup_id):
polgroupdir.invokeFactory('themis.datatypes.polgroup',
polgroup_id, title=polgroup)
try:
workflowTool.doActionFor(getattr(polgroupdir, polgroup_id), 'publish')
except WorkflowException:
pass
polgroup_intid = intids.getId(getattr(polgroupdir, polgroup_id))
polgroup_ids[polgroup] = polgroup_intid
object.polgroup = RelationValue(polgroup_ids.get(polgroup))
object.polgroup = RelationValue(self.get_polgroup_intid(polgroup))
try:
workflowTool.doActionFor(object, 'publish')
self.portal_workflow.doActionFor(object, 'publish')
except WorkflowException:
pass
#self.request.response.redirect('./')
class SyncCommissionsFromPcfDbView(SyncFromPcfDbView):
def __call__(self):
self.setup()
# comtyp, comcat
# |
# \-- select id, nom from t_comtyp where st = S_ACTIVE
#
# \-- select id, nom from t_comcat where st = S_ACTIVE
class SyncDocumentsFromPcfDbView(SyncFromPcfDbView):
def __call__(self):
self.setup()
cursor = self.db_connection.cursor()
cursor.execute('''SELECT id, sess, date, no, nodoc, intit, auteurs, matiereids
FROM t_document
WHERE st = 'S_INDEXED' AND intit IS NOT NULL''')
type_info = self.portal_types.getTypeInfo('tabellio.documents.document')
while True:
row = cursor.fetchone()
if row is None:
break
doc_id, sess, date, no, nodoc, intit, authors, subjects = row
if not hasattr(self.context, doc_id):
type_info._constructInstance(self.context, doc_id)
object = getattr(self.context, doc_id)
object.title = intit
object.date = date
object.no = no
object.nodoc = nodoc
try:
self.portal_workflow.doActionFor(object, 'publish')
except WorkflowException:
pass
# TODO: catalog(?)
class SyncDossiersFromPcfDbView(SyncFromPcfDbView):
def __call__(self):
self.setup()