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()