diff --git a/product/ERP5/Document/Document.py b/product/ERP5/Document/Document.py index 5c41655245dba8e843b00f1fb14fcaee08965865..471c209801beff589a9c217bafcfb1552125f225 100644 --- a/product/ERP5/Document/Document.py +++ b/product/ERP5/Document/Document.py @@ -60,9 +60,11 @@ from Products.ERP5.mixin.text_convertable import TextConvertableMixin from Products.ERP5.mixin.downloadable import DownloadableMixin from Products.ERP5.mixin.document import DocumentMixin from Products.ERP5.mixin.extensible_traversable import DocumentExtensibleTraversableMixIn +from Products.ERP5.mixin.crawable import CrawableMixin _MARKER = [] VALID_ORDER_KEY_LIST = ('user_login', 'content', 'file_name', 'input') + # these property ids are unchangable FIXED_PROPERTY_IDS = ('id', 'uid', 'rid', 'sid') @@ -129,61 +131,8 @@ class DocumentProxyError(Exception):pass class NotConvertedError(Exception):pass allow_class(NotConvertedError) -class UpdateMixIn: - """ - Provides an API to compute a date index based on the update - frequency of the document. - """ - - # Declarative security - security = ClassSecurityInfo() - - security.declareProtected(Permissions.AccessContentsInformation, 'getFrequencyIndex') - def getFrequencyIndex(self): - """ - Returns the document update frequency as an integer - which is used by alamrs to decide which documents - must be updates at which time. The index represents - a time slot (ex. all days in a month, all hours in a week). - """ - try: - return self.getUpdateFrequencyValue().getIntIndex() - except AttributeError: - # Catch Attribute error or Key error - XXX not beautiful - return 0 - - security.declareProtected(Permissions.AccessContentsInformation, 'getCreationDateIndex') - def getCreationDateIndex(self, at_date = None): - """ - Returns the document Creation Date Index which is the creation - date converted into hours modulo the Frequency Index. - """ - frequency_index = self.getFrequencyIndex() - if not frequency_index: return -1 # If not update frequency is provided, make sure we never update - hour = convertDateToHour(date=self.getCreationDate()) - creation_date_index = hour % frequency_index - # in the case of bisextile year, we substract 24 hours from the creation date, - # otherwise updating documents (frequency=yearly update) created the last - # 24 hours of bissextile year will be launched once every 4 years. - if creation_date_index >= number_of_hours_in_year: - creation_date_index = creation_date_index - number_of_hours_in_day - - return creation_date_index - - security.declareProtected(Permissions.AccessContentsInformation, 'isUpdatable') - def isUpdatable(self): - """ - This method is used to decide which document can be updated - in the crawling process. This can depend for example on - workflow states (publication state, - validation state) or on roles on the document. - """ - method = self._getTypeBasedMethod('isUpdatable', - fallback_script_id = 'Document_isUpdatable') - return method() - class Document(DocumentExtensibleTraversableMixIn, XMLObject, UrlMixIn, CachedConvertableMixin, - SnapshotMixin, UpdateMixIn, TextConvertableMixin, + SnapshotMixin, CrawableMixin, TextConvertableMixin, DownloadableMixin, DocumentMixin): """Document is an abstract class with all methods related to document management in ERP5. This includes searchable text, explicit relations, diff --git a/product/ERP5/Document/ExternalSource.py b/product/ERP5/Document/ExternalSource.py index 54952221dcd04b079d72aea8157a9d8df7d54f10..eb3e4cc845e27e73093c02f63563a42e17d37889 100644 --- a/product/ERP5/Document/ExternalSource.py +++ b/product/ERP5/Document/ExternalSource.py @@ -29,9 +29,9 @@ from AccessControl import ClassSecurityInfo from Products.ERP5Type import Permissions, PropertySheet from Products.ERP5Type.XMLObject import XMLObject from Products.ERP5.Document.Url import UrlMixIn -from Products.ERP5.Document.Document import UpdateMixIn +from Products.ERP5.mixin.crawable import CrawableMixin -class ExternalSource(XMLObject, UrlMixIn, UpdateMixIn): +class ExternalSource(XMLObject, UrlMixIn, CrawableMixin): """ An External Source consists of single URL which defines the root of a collection of documents, each of which can be accessed diff --git a/product/ERP5/interfaces/crawlable.py b/product/ERP5/interfaces/crawlable.py index 057acbeab934d1e5f0831809448b88c3a1d1a7fc..898d5dd4089444b70e5cde856e9a5545b565008f 100644 --- a/product/ERP5/interfaces/crawlable.py +++ b/product/ERP5/interfaces/crawlable.py @@ -91,3 +91,25 @@ class ICrawlable(Interface): but with a different signature. This is probably inconsistent and the interface must be revised. XXX """ + + def isUpdatable(self): + """ + This method is used to decide if document can be updated + in the crawling process. + """ + + def getFrequencyIndex(): + """ + Returns the document update frequency as an integer + which is used by alamrs to decide which documents + must be updates at which time. The index represents + a time slot (ex. all days in a month, all hours in a week). + Note (ivan): not sure about this if needs to be part interface or not + """ + + def getCreationDateIndex(at_date): + """ + Returns the document Creation Date Index which is the creation + date converted into hours modulo the Frequency Index. + Note (ivan): not sure about this if needs to be part interface or not + """ diff --git a/product/ERP5/mixin/crawable.py b/product/ERP5/mixin/crawable.py new file mode 100644 index 0000000000000000000000000000000000000000..2b010b99a5f06d14fa2592cae6c7ea3f2a0fc01d --- /dev/null +++ b/product/ERP5/mixin/crawable.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved. +# Ivan Tyagov <ivan@nexedi.com> +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + +from AccessControl import ClassSecurityInfo, getSecurityManager +from Products.ERP5Type import Permissions + +class CrawableMixin: + """ + Generic implementation of ICrawlable interface + """ + # Declarative security + security = ClassSecurityInfo() + + security.declareProtected(Permissions.AccessContentsInformation, 'getFrequencyIndex') + def getFrequencyIndex(self): + """ + Returns the document update frequency as an integer + which is used by alamrs to decide which documents + must be updates at which time. The index represents + a time slot (ex. all days in a month, all hours in a week). + """ + try: + return self.getUpdateFrequencyValue().getIntIndex() + except AttributeError: + # Catch Attribute error or Key error - XXX not beautiful + return 0 + + security.declareProtected(Permissions.AccessContentsInformation, 'getCreationDateIndex') + def getCreationDateIndex(self, at_date = None): + """ + Returns the document Creation Date Index which is the creation + date converted into hours modulo the Frequency Index. + """ + frequency_index = self.getFrequencyIndex() + if not frequency_index: return -1 # If not update frequency is provided, make sure we never update + hour = convertDateToHour(date=self.getCreationDate()) + creation_date_index = hour % frequency_index + # in the case of bisextile year, we substract 24 hours from the creation date, + # otherwise updating documents (frequency=yearly update) created the last + # 24 hours of bissextile year will be launched once every 4 years. + if creation_date_index >= number_of_hours_in_year: + creation_date_index = creation_date_index - number_of_hours_in_day + + return creation_date_index + + security.declareProtected(Permissions.AccessContentsInformation, 'isUpdatable') + def isUpdatable(self): + """ + This method is used to decide which document can be updated + in the crawling process. This can depend for example on + workflow states (publication state, + validation state) or on roles on the document. + """ + method = self._getTypeBasedMethod('isUpdatable', + fallback_script_id = 'Document_isUpdatable') + return method() \ No newline at end of file