def _can_remove_item(self, item, processed_item=None): """Recursively checks if the item can be removed. :param dict item: item to be remove :param set processed_item: processed items :return: True if item can be removed, False otherwise. """ if processed_item is None: processed_item = dict() item_refs = [] package_service = PackageService() archive_service = get_resource_service(ARCHIVE) if item.get(ITEM_TYPE) == CONTENT_TYPE.COMPOSITE: # Get the item references for is package item_refs = package_service.get_residrefs(item) if item.get(ITEM_TYPE) in [CONTENT_TYPE.TEXT, CONTENT_TYPE.PREFORMATTED]: broadcast_items = get_resource_service('archive_broadcast').get_broadcast_items_from_master_story(item) # If master story expires then check if broadcast item is included in a package. # If included in a package then check the package expiry. item_refs.extend([broadcast_item.get(config.ID_FIELD) for broadcast_item in broadcast_items]) if item.get('rewrite_of'): item_refs.append(item.get('rewrite_of')) if item.get('rewritten_by'): item_refs.append(item.get('rewritten_by')) # get the list of associated item ids if item.get(ITEM_TYPE) in MEDIA_TYPES: item_refs.extend(self._get_associated_items(item)) else: item_refs.extend(self._get_associated_media_id(item)) # get item reference where this referred item_refs.extend(package_service.get_linked_in_package_ids(item)) # check item refs in the ids to remove set is_expired = item.get('expiry') and item.get('expiry') < utcnow() if is_expired: # now check recursively for all references if item.get(config.ID_FIELD) in processed_item: return is_expired processed_item[item.get(config.ID_FIELD)] = item if item_refs: archive_items = archive_service.get_from_mongo(req=None, lookup={'_id': {'$in': item_refs}}) for archive_item in archive_items: is_expired = self._can_remove_item(archive_item, processed_item) if not is_expired: break return is_expired
def _can_remove_item(self, item, processed_item=None): """ Recursively checks if the item can be removed. :param dict item: item to be remove :param set processed_item: processed items :return: True if item can be removed, False otherwise. """ if processed_item is None: processed_item = set() item_refs = [] package_service = PackageService() archive_service = get_resource_service(ARCHIVE) if item.get(ITEM_TYPE) == CONTENT_TYPE.COMPOSITE: # Get the item references for is package item_refs = package_service.get_residrefs(item) if item.get(PACKAGE_TYPE) == TAKES_PACKAGE or \ item.get(ITEM_TYPE) in [CONTENT_TYPE.TEXT, CONTENT_TYPE.PREFORMATTED]: broadcast_items = get_resource_service( 'archive_broadcast').get_broadcast_items_from_master_story( item) # If master story expires then check if broadcast item is included in a package. # If included in a package then check the package expiry. item_refs.extend([ broadcast_item.get(config.ID_FIELD) for broadcast_item in broadcast_items ]) # get item reference where this referred item_refs.extend(package_service.get_linked_in_package_ids(item)) # check item refs in the ids to remove set is_expired = item.get('expiry') < utcnow() if is_expired: # now check recursively for all references if item.get(config.ID_FIELD) in processed_item: return is_expired processed_item.add(item.get(config.ID_FIELD)) if item_refs: archive_items = archive_service.get_from_mongo( req=None, lookup={'_id': { '$in': item_refs }}) for archive_item in archive_items: is_expired = self._can_remove_item(archive_item, processed_item) if not is_expired: break return is_expired
def _can_remove_item(self, item, processed_item=None, preserve_published_desks=None): """Recursively checks if the item can be removed. :param dict item: item to be remove :param set processed_item: processed items :return: True if item can be removed, False otherwise. """ if processed_item is None: processed_item = dict() item_refs = [] package_service = PackageService() archive_service = get_resource_service(ARCHIVE) if item.get(ITEM_TYPE) == CONTENT_TYPE.COMPOSITE: # Get the item references for is package item_refs = package_service.get_residrefs(item) if item.get(ITEM_TYPE) in [ CONTENT_TYPE.TEXT, CONTENT_TYPE.PREFORMATTED ]: broadcast_items = get_resource_service( 'archive_broadcast').get_broadcast_items_from_master_story( item) # If master story expires then check if broadcast item is included in a package. # If included in a package then check the package expiry. item_refs.extend([ broadcast_item.get(config.ID_FIELD) for broadcast_item in broadcast_items ]) if item.get('rewrite_of'): item_refs.append(item.get('rewrite_of')) if item.get('rewritten_by'): item_refs.append(item.get('rewritten_by')) # get the list of associated item ids if item.get(ITEM_TYPE) in MEDIA_TYPES: item_refs.extend(self._get_associated_items(item)) # get item reference where this referred item_refs.extend(package_service.get_linked_in_package_ids(item)) # check item refs in the ids to remove set is_expired = item.get('expiry') and item.get('expiry') < utcnow() # if the item is published or corrected and desk has preserve_published_content as true if preserve_published_desks and \ item.get(ITEM_STATE) in {CONTENT_STATE.PUBLISHED, CONTENT_STATE.CORRECTED} and \ item.get('task').get('desk') in preserve_published_desks: is_expired = False # If the item is associated with a planning assignment and not published then preserve it if item.get('assignment_id') and item.get( ITEM_STATE) not in PUBLISH_STATES: try: assignment = superdesk.get_resource_service( 'assignments').find_one(req=None, _id=item['assignment_id']) if assignment is not None: is_expired = False except KeyError: # planning is not enabled pass if is_expired: # now check recursively for all references if item.get(config.ID_FIELD) in processed_item: return is_expired processed_item[item.get(config.ID_FIELD)] = item if item_refs: archive_items = archive_service.get_from_mongo( req=None, lookup={'_id': { '$in': item_refs }}) for archive_item in archive_items: is_expired = self._can_remove_item( archive_item, processed_item, preserve_published_desks) if not is_expired: break # If this item is not expired then it is potentially keeping it's parent alive. if not is_expired: logger.info('{} Item ID: [{}] has not expired'.format( self.log_msg, item.get(config.ID_FIELD))) return is_expired
def _can_remove_item(self, item, processed_item=None, preserve_published_desks=None): """Recursively checks if the item can be removed. :param dict item: item to be remove :param set processed_item: processed items :return: True if item can be removed, False otherwise. """ if processed_item is None: processed_item = dict() item_refs = [] package_service = PackageService() archive_service = get_resource_service(ARCHIVE) if item.get(ITEM_TYPE) == CONTENT_TYPE.COMPOSITE: # Get the item references for is package item_refs = package_service.get_residrefs(item) if item.get(ITEM_TYPE) in [ CONTENT_TYPE.TEXT, CONTENT_TYPE.PREFORMATTED ]: broadcast_items = get_resource_service( 'archive_broadcast').get_broadcast_items_from_master_story( item) # If master story expires then check if broadcast item is included in a package. # If included in a package then check the package expiry. item_refs.extend([ broadcast_item.get(config.ID_FIELD) for broadcast_item in broadcast_items ]) if item.get('rewrite_of'): item_refs.append(item.get('rewrite_of')) if item.get('rewritten_by'): item_refs.append(item.get('rewritten_by')) # get the list of associated item ids if item.get(ITEM_TYPE) in MEDIA_TYPES: item_refs.extend(self._get_associated_items(item)) # get item reference where this referred item_refs.extend(package_service.get_linked_in_package_ids(item)) # check item refs in the ids to remove set is_expired = item.get('expiry') and item.get('expiry') < utcnow() # if the item is published or corrected and desk has preserve_published_content as true if preserve_published_desks and \ item.get(ITEM_STATE) in {CONTENT_STATE.PUBLISHED, CONTENT_STATE.CORRECTED} and \ item.get('task').get('desk') in preserve_published_desks: is_expired = False if is_expired: # now check recursively for all references if item.get(config.ID_FIELD) in processed_item: return is_expired processed_item[item.get(config.ID_FIELD)] = item if item_refs: archive_items = archive_service.get_from_mongo( req=None, lookup={'_id': { '$in': item_refs }}) for archive_item in archive_items: is_expired = self._can_remove_item( archive_item, processed_item, preserve_published_desks) if not is_expired: break return is_expired