164 lines
6.1 KiB
Python
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()
|