diff --git a/setup.py b/setup.py
index ef21808..be3257f 100644
--- a/setup.py
+++ b/setup.py
@@ -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: -*-
diff --git a/tabellio/pcfdb/configure.zcml b/tabellio/pcfdb/configure.zcml
index 5132340..384b537 100644
--- a/tabellio/pcfdb/configure.zcml
+++ b/tabellio/pcfdb/configure.zcml
@@ -9,9 +9,30 @@
+
+
+
+
+
+
diff --git a/tabellio/pcfdb/sync.py b/tabellio/pcfdb/sync.py
index 37d8e2b..106fea6 100644
--- a/tabellio/pcfdb/sync.py
+++ b/tabellio/pcfdb/sync.py
@@ -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()