This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
tabellio.pcfdb/tabellio/pcfdb/sync.py

164 lines
6.1 KiB
Python

from Products.CMFCore.WorkflowCore import WorkflowException
from Products.Five.browser import BrowserView
from z3c.sqlalchemy import getSAWrapper, createSAWrapper
from Products.CMFCore.utils import getToolByName
from zope import component
from zope.app.intid.interfaces import IIntIds
from z3c.relationfield import RelationValue
from plone.registry.interfaces import IRegistry
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
t_pers.prenom is not NULL and
t_pers.id = t_pershistoline.pers and
t_pershistoline.description = t_comppol.id and
t_pershistoline.type = 'P_CMPL' and
t_pershistoline.fin IS NULL and
t_pers.id = t_parl.id and
t_parl.arrond = t_arrond.id
''')
polgroup_ids = {}
while True:
row = cursor.fetchone()
if row is None:
break
pers_id, lastname, firstname, sex, birthdate, polgroup, district = row
fullname = '%s %s' % (firstname, lastname)
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.deputies_folder, new_id)
object.firstname = firstname
object.lastname = lastname
object.sex = sex
object.birthdate = birthdate
object.district = district
object.polgroup = RelationValue(self.get_polgroup_intid(polgroup))
try:
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()