diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Alarm_activateCheckConsistency.py b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Alarm_activateCheckConsistency.py index 03a9533c383277653aa0b55165df5e2cfb2df6e7..b693175e5839b82bb0e0e7d58edcf9b05216f308 100644 --- a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Alarm_activateCheckConsistency.py +++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Alarm_activateCheckConsistency.py @@ -1,9 +1,12 @@ kw = {} if context.getProperty('incremental_check'): - last_active_process = context.getLastActiveProcess() + last_active_process = context.getLastActiveProcess(include_active=True) if last_active_process is not None: - kw['indexation_timestamp'] = '>= %s' % last_active_process.getStartDate().ISO() + kw['indexation_timestamp'] = { + 'query': last_active_process.getStartDate(), + 'range': '>=' + } active_process = context.newActiveProcess().getRelativeUrl() query_string = context.getProperty('catalog_query_string', '') @@ -13,8 +16,16 @@ portal = context.getPortalObject() if query_string is not None: kw.update(SearchableText=query_string) -kw.update(parent_uid=[portal.restrictedTraverse(module).getUid() for module in context.getProperty('module_list') or []]) +parent_uid =[portal.restrictedTraverse(module).getUid() + for module in context.getProperty('module_list') or []] +if parent_uid: + kw.update(parent_uid=parent_uid) -portal.portal_catalog.searchAndActivate(method_id='Base_checkAlarmConsistency', method_kw={'fixit': fixit, 'active_process': active_process}, activate_kw={'tag':tag, 'priority': 8}, **kw) + +portal.portal_catalog.searchAndActivate( + method_id='Base_checkAlarmConsistency', + method_kw={'fixit': fixit, 'active_process': active_process}, + activate_kw={'tag':tag, 'priority': 8}, + **kw) context.activate(after_tag=tag).getId() diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_checkAlarmConsistency.py b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_checkAlarmConsistency.py index 8f032224607d4de501e3caf2c2f307fb9a465e13..6c3933bd7fe0c5af494af4acdb1f1ef7d029fd74 100644 --- a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_checkAlarmConsistency.py +++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_checkAlarmConsistency.py @@ -9,8 +9,11 @@ if context.providesIConstraint(): # of this name implement consistency checking on object return constraint_message_list +# this constraint is created as a temp object under portal_trash, because +# portal_trash has no restriction on allowed content types. missing_category_document = portal.portal_trash.newContent( portal_type='Missing Category Document Constraint', + id='missing_category_document_constraint', temp_object=True) property_type_validity = PropertyTypeValidity(id='type_check', description='Type Validity Check') diff --git a/bt5/erp5_administration/TestTemplateItem/portal_components/test.erp5.testERP5Administration.py b/bt5/erp5_administration/TestTemplateItem/portal_components/test.erp5.testERP5Administration.py index fe4dfd09f140bd52ca28410b37441c00296b2a48..060dc829438098151b47b78211e96ba6559ee0b7 100644 --- a/bt5/erp5_administration/TestTemplateItem/portal_components/test.erp5.testERP5Administration.py +++ b/bt5/erp5_administration/TestTemplateItem/portal_components/test.erp5.testERP5Administration.py @@ -28,6 +28,7 @@ ############################################################################## import unittest +import time from Products.ERP5.tests.testInventoryAPI import InventoryAPITestCase class TestERP5Administration(InventoryAPITestCase): @@ -83,11 +84,10 @@ class TestERP5Administration(InventoryAPITestCase): def test_check_consistency_alarm(self): alarm = self.portal.portal_alarms.check_consistency - # Here we disable user_id so that Person_createUserPreference will not be called - # automatically. - person = self.portal.person_module.newContent(portal_type='Person', user_id=None) + inconsistent_document = self.portal.organisation_module.newContent( + portal_type='Organisation') # this document will be non consistent, for PropertyTypeValidity - person.title = 3 + inconsistent_document.title = 3 # tic right now to make sure the person is indexed, indeed the alarm # could use catalog to retrieve objects to check self.tic() @@ -112,7 +112,39 @@ class TestERP5Administration(InventoryAPITestCase): # case of PropertyTypeValidity alarm.solve() self.tic() - self.assertEqual('3', person.title) + self.assertEqual('3', inconsistent_document.title) + + def test_check_consistency_incremental(self): + alarm = self.portal.portal_alarms.check_consistency.Base_createCloneDocument( + batch_mode=True) + alarm.edit(incremental_check=True) + alarm.activeSense() + self.tic() + # create an inconsistent document + inconsistent_document = self.portal.organisation_module.newContent( + portal_type='Organisation') + inconsistent_document.title = 0 + self.tic() + + # alarm report this document as not consistent + time.sleep(2) # catalog date columns have a one second precision + alarm.activeSense() + self.tic() + self.assertTrue(alarm.sense()) + result, = alarm.getLastActiveProcess().getResultList() + constraint_message, = result.getProperty('constraint_message_list') + self.assertEqual(inconsistent_document.getRelativeUrl(), constraint_message.object_relative_url) + + # next time the alarm run, document is not reported anymore + alarm.activeSense() + self.tic() + self.assertFalse(alarm.sense()) + self.assertEqual([], alarm.getLastActiveProcess().getResultList()) + + # cleanup + self.portal.organisation_module.manage_delObjects( + ids=[inconsistent_document.getId()]) + self.tic() def test_missing_category_document_constraint(self): person = self.portal.person_module.newContent(portal_type='Person') diff --git a/product/ERP5/Document/Alarm.py b/product/ERP5/Document/Alarm.py index 82da5beb495d4664966803d60aa101193cc14a5a..690bd92a097c9fbf035a13500dbe47fd7cba3925 100644 --- a/product/ERP5/Document/Alarm.py +++ b/product/ERP5/Document/Alarm.py @@ -382,7 +382,7 @@ Alarm Tool Node: %s limit = 1 else: limit = self.isActive() and 2 or 1 - active_process_list = self.getPortalObject().portal_catalog( + active_process_list = self.getPortalObject().portal_catalog.unrestrictedSearchResults( portal_type='Active Process', limit=limit, sort_on=(('creation_date', 'DESC'), ('id', 'DESC', 'UNSIGNED'),), diff --git a/product/ZMySQLDA/db.py b/product/ZMySQLDA/db.py index cd18bb52c24700f35281651cc779d938a72f5bcc..b3b3aebc574c6befcdd7e2d99e6898d32c0b7e0e 100644 --- a/product/ZMySQLDA/db.py +++ b/product/ZMySQLDA/db.py @@ -314,6 +314,7 @@ class DB(TM): error=True, ) self.db = MySQLdb.connect(**self._kw_args) + self._query("SET time_zone='+00:00'") def tables(self, rdb=0, _care=('TABLE', 'VIEW')):