def getResults(self): context = Acquisition.aq_inner(self.context) # try to get query parameters from Topic (if present) query = hasattr(context, 'buildQuery') and context.buildQuery() if query: catalog = getToolByName(context, 'portal_catalog') results = catalog(query) # filter out results that are both outdated and expired to_show = [ x for x in results if not (getattr(x, 'outdated', False) and isExpired(x)) ] return to_show # otherwise construct a query portal_state = getMultiAdapter((self.context, self.request), name=u'plone_portal_state') navigation_root_path = portal_state.navigation_root_path() oshaview = getMultiAdapter((self.context, self.request), name=u'oshaview') mySEP = oshaview.getCurrentSingleEntryPoint() kw = '' if mySEP: kw = mySEP.getProperty('keyword', '') query = '(portal_type:("News Item") OR isNews:true) AND ' 'review_state:published AND path_parents:%s' % navigation_root_path if kw != '': query = ' AND '.join([query, 'Subject:(%s)' % ' OR '.join(kw)]) return search_solr(query, sort='Date desc')
def testIsExpiredWithExplicitExpiredContent(self): self.setRoles(['Manager']) self.folder.invokeFactory('Document', id='d1', title='Doc 1') self.folder.d1.content_status_modify(workflow_action='publish', effective_date='1/1/2001', expiration_date='1/2/2001') self.assertTrue(isExpired(self.folder.d1))
def getResults(self): context = Acquisition.aq_inner(self.context) # try to get query parameters from Topic (if present) query = hasattr(context, 'buildQuery') and context.buildQuery() if query: catalog = getToolByName(context, 'portal_catalog') results = catalog(query) # filter out results that are both outdated and expired to_show = [ x for x in results if not ( getattr(x, 'outdated', False) and isExpired(x)) ] return to_show # otherwise construct a query portal_state = getMultiAdapter( (self.context, self.request), name=u'plone_portal_state') navigation_root_path = portal_state.navigation_root_path() oshaview = getMultiAdapter( (self.context, self.request), name=u'oshaview') mySEP = oshaview.getCurrentSingleEntryPoint() kw = '' if mySEP: kw = mySEP.getProperty('keyword', '') query = '(portal_type:("News Item") OR isNews:true) AND ' 'review_state:published AND path_parents:%s' % navigation_root_path if kw != '': query = ' AND '.join([query, 'Subject:(%s)' % ' OR '.join(kw)]) return search_solr(query, sort='Date desc')
def expired(self, brain): if brain.portal_type not in ['News Item', 'Link', 'Event']: return False if isExpired(brain) == 1: return True return False
def render(self): if not self.outdated: return "" is_anon = getToolByName(self, 'portal_membership').isAnonymousUser() if isExpired(self.context) and is_anon: parent = aq_parent(self.context) self.request.response.redirect( "%s?msg=deleted_content&portal_type=%s" % ( parent.absolute_url(), self.context.portal_type), status=301) return super(OutdatedViewlet, self).render()
def render(self): if not self.outdated: return "" is_anon = getToolByName(self, 'portal_membership').isAnonymousUser() if isExpired(self.context) and is_anon: parent = aq_parent(self.context) self.request.response.redirect( "%s?msg=deleted_content&portal_type=%s" % (parent.absolute_url(), self.context.portal_type), status=301) return super(OutdatedViewlet, self).render()
def news(self, limit=MAX_NUMBER_NEWS): catalog = self.context.portal_catalog query = { 'portal_type': 'News Item', 'sort_on': 'effective', 'sort_order': 'descending', 'review_state': 'published', } result = [x for x in catalog(**query) if isExpired(x) != 1] return result[:limit]
def news(self, limit=MAX_NUMBER_NEWS): catalog = self.context.portal_catalog query = { 'portal_type': 'News Item', 'sort_on': 'effective', 'sort_order': 'descending', 'review_state': 'published', } result = [x for x in catalog(**query) if isExpired(x) != 1] return result[:limit]
def __call__(self): context = aq_inner(self.context) catalog = getToolByName(context, 'portal_catalog') portal_languages = getToolByName(self.context, 'portal_languages') preflang = portal_languages.getPreferredLanguage() # try to get query parameters from Topic (if present) query = getattr(context, 'buildQuery', None) and context.buildQuery() if not query: # search in the navigation root of the currently selected language and in the English path # with Language = preferredLanguage or neutral paths = list() portal_state = getMultiAdapter((self.context, self.request), name=u'plone_portal_state') navigation_root_path = portal_state.navigation_root_path() navigation_root = portal_state.portal().restrictedTraverse( navigation_root_path) teaser = getattr(navigation_root, 'teaser', None) if teaser: teaser_path = '/'.join(teaser.getPhysicalPath()) paths.append(teaser_path) try: canonical_path = '/'.join( teaser.getCanonical().getPhysicalPath()) paths.append(canonical_path) except: pass state = 'published' now = DateTime() query = dict(portal_type='News Item', review_state=state, path=paths, effective={ 'query': now, 'range': 'max' }, expires={ 'query': now, 'range': 'min' }, sort_on='effective', sort_order='reverse', Language=['', preflang]) items = catalog(query) self.items = [ x for x in items if not (getattr(x, 'outdated', False) and isExpired(x)) ] return self.index()
def query(self): search = self.context.restrictedTraverse('@@language-fallback-search') url = getToolByName(self.context, 'portal_url') portal_path = url.getPortalPath() # Only use specific fields, so you can't do arbitrary queries. query = { 'sort_on': 'effective', 'sort_order': 'descending', 'effective': { 'query': DateTime(), 'range': 'max' }, } form = self.request.form # required fields: for each in ['portal_type', 'Subject', 'path', 'Language']: query[each] = form[each] # optional fields: for each in ['object_provides']: query[each] = form.get(each, '') # start/end (also optional) if 'start' in form: query['end'] = {'query': DateTime(form['start']), 'range': 'min'} if 'end' in form: query['start'] = {'query': DateTime(form['end']), 'range': 'max'} query['path'] = portal_path + query['path'] query['Subject'] = query['Subject'].split(',') q_size = form.get('q_size', 20) q_start = form.get('q_start', 0) brains = search.search(query) result = [] for brain in brains[q_start:q_start + q_size]: if query['portal_type'] in ( 'News Item', 'Event', 'PressRelease') and (getattr( brain, 'outdated', False) or isExpired(brain)): continue ob = brain.getObject() mapping = self._getMapping(ob) mapping['_type'] = ob.portal_type mapping['_path'] = url.getRelativeContentURL(ob) mapping['_url'] = ob.absolute_url() result.append(mapping) jsondata = json.dumps(result, encoding='UTF-8') #self.request.response.setHeader("Content-type", "application/json") #self.request.response.setHeader("Content-disposition","attachment;filename=hwcexport.json") return jsondata
def __call__(self): catalog = self.context.portal_catalog query = { 'portal_type': 'News Item', 'sort_on': 'effective', 'sort_order': 'descending', 'review_state': 'published', } # [ # { # "id":"123", # "title":"Title", # "link":"https:\/\/...", # "image":"https:\/\/...", # "abstract":"text", # "tags":["Coronavirus"], # "created":"2020-04-01T13:10:48+01:00", # "updated":"2020-04-01T11:34:02+01:00" # },{...} # ] result = [x for x in catalog(**query) if isExpired(x) != 1] covid_news = [ x for x in result if 'Coronavirus' in x.Subject or 'Covid-19' in x.Subject ] res = [] for item in covid_news: res.append({ "id": item.id, 'title': item.Title, 'link': item.getURL(), 'image': item.getURL() + '/@@images/image/preview', 'abstract': item.Description, 'tags': [x for x in item.Subject], 'created': item.created.strftime("%Y-%m-%dT%H:%M:%S+03:00"), 'updated': item.modified.strftime("%Y-%m-%dT%H:%M:%S+03:00") }) self.request.response.setHeader('Content-Type', 'application/json') return json.dumps(res)
def query(self): search = self.context.restrictedTraverse('@@language-fallback-search') url = getToolByName(self.context, 'portal_url') portal_path = url.getPortalPath() # Only use specific fields, so you can't do arbitrary queries. query = { 'sort_on': 'effective', 'sort_order': 'descending', 'effective': {'query': DateTime(), 'range': 'max'}, } form = self.request.form # required fields: for each in ['portal_type', 'Subject', 'path', 'Language']: query[each] = form[each] # optional fields: for each in ['object_provides']: query[each] = form.get(each, '') # start/end (also optional) if 'start' in form: query['end'] = {'query': DateTime(form['start']), 'range': 'min'} if 'end' in form: query['start'] = {'query': DateTime(form['end']), 'range': 'max'} query['path'] = portal_path + query['path'] query['Subject'] = query['Subject'].split(',') q_size = form.get('q_size', 20) q_start = form.get('q_start', 0) brains = search.search(query) result = [] for brain in brains[q_start:q_start + q_size]: if query['portal_type'] in ('News Item', 'Event', 'PressRelease') and ( getattr(brain, 'outdated', False) or isExpired(brain)): continue ob = brain.getObject() mapping = self._getMapping(ob) mapping['_type'] = ob.portal_type mapping['_path'] = url.getRelativeContentURL(ob) mapping['_url'] = ob.absolute_url() result.append(mapping) jsondata = json.dumps(result, encoding='UTF-8') #self.request.response.setHeader("Content-type", "application/json") #self.request.response.setHeader("Content-disposition","attachment;filename=hwcexport.json") return jsondata
def test_publishing_subobjects_and_expire_them(self): paths = [] for o in (self.folder.d1, self.folder.f1): paths.append("/".join(o.getPhysicalPath())) self.folder_publish( workflow_action="publish", paths=paths, effective_date="1/1/2001", expiration_date="1/2/2001", include_children=True, ) for o in (self.folder.d1, self.folder.f1, self.folder.f1.d2, self.folder.f1.f2): self.assertEqual(self.workflow.getInfoFor(o, "review_state"), "published") self.assertTrue(isExpired(o))
def _archive_news(site): """ Script that will get called by cron once per day """ catalog = getToolByName(site, 'portal_catalog') query = { 'portal_type': ['News Item', 'Link', 'Event'], 'review_state': 'published' } brains = catalog.searchResults(**query) for b in brains: obj = b.getObject() # if isExpired(obj) == 1 and api.content.get_state(obj) != 'archived': if isExpired(obj) == 1: logger.info('Archiving %s' % obj.absolute_url()) api.content.transition(obj, 'archive') transaction.commit()
def get_event_list(self, start=None, stop=None): now = DateTime() events = (i.getObject() for i in self.get_events() if not (getattr(i, 'outdated', False) and isExpired(i))) months = [] month_info = [] old_month_year = None for event in events: start = event.start() month = str(start.month()) year = str(start.year()) month_year = year + month if month_year != old_month_year: old_month_year = month_year if month_info: months.append(month_info) month_info = { 'month': start.month(), 'year': start.year(), # e.g. month_oct as used in the plonelocales i18n:domain 'month_name': "month_%s" % (start.strftime("%B").lower()[:3]), 'events': [] } isDateToBeConfirmed = (True if hasattr(event, "dateToBeConfirmed") and event.dateToBeConfirmed else False) isOutdated = IAnnotations(event).get("slc.outdated", False) event_dict = { 'event': event, 'day': start.day(), 'start': start, 'end': event.end(), 'location': event.getLocation(), 'title': event.Title(), 'description': event.Description(), 'url': event.absolute_url(), 'is_tbc': isDateToBeConfirmed, 'is_outdated': isOutdated } month_info['events'].append(event_dict) if month_info: months.append(month_info) return months
def _data(self): """Search for news everywhere, then try to find translations in the current language. If no translation is found, use the 'en' version. """ current_path = self.context.getPhysicalPath() if len(current_path) > 3 and current_path[3] in ('sub', 'fop'): # in a subsite, take only the subsite or fop site path = '/'.join(self.navigation_root_path.split('/')[:-1]) INFOP = True else: # in the main site, exclude sub path = "/osha/portal AND -/osha/portal/sub AND -/osha/portal/fop" INFOP = False subject = list(self.data.subject) limit = self.data.count # make sure to exclude the subs query = '(portal_type:"News Item" OR isNews:true) AND ' \ 'review_state:(%(review_state)s) AND path_parents:(%(path)s) ' \ 'AND effective:[* TO %(effective)s]' % \ {'review_state': ' OR '.join(self.data.state), 'path': path, 'effective': iso8601date(DateTime()), } if subject: query += ' AND Subject:(%s)' % ' OR '.join(subject) if INFOP: results = search_solr(query, sort='Date desc', rows=limit) else: lf_search_view = self.context.restrictedTraverse( "@@language-fallback-search") results = lf_search_view.search_solr( query, sort='Date desc', rows=limit) # lang_query=False) items = list() for res in results[:limit]: if isExpired(res) and getattr(res, 'outdated', False): continue try: items.append(res.getObject()) except Exception: pass return items
def _data(self): """Search for news everywhere, then try to find translations in the current language. If no translation is found, use the 'en' version. """ current_path = self.context.getPhysicalPath() if len(current_path) > 3 and current_path[3] in ('sub', 'fop'): # in a subsite, take only the subsite or fop site path = '/'.join(self.navigation_root_path.split('/')[:-1]) INFOP = True else: # in the main site, exclude sub path = "/osha/portal AND -/osha/portal/sub AND -/osha/portal/fop" INFOP = False subject = list(self.data.subject) limit = self.data.count # make sure to exclude the subs query = '(portal_type:"News Item" OR isNews:true) AND ' \ 'review_state:(%(review_state)s) AND path_parents:(%(path)s) ' \ 'AND effective:[* TO %(effective)s]' % \ {'review_state': ' OR '.join(self.data.state), 'path': path, 'effective': iso8601date(DateTime()), } if subject: query += ' AND Subject:(%s)' % ' OR '.join(subject) if INFOP: results = search_solr(query, sort='Date desc', rows=limit) else: lf_search_view = self.context.restrictedTraverse( "@@language-fallback-search") results = lf_search_view.search_solr( query, sort='Date desc', rows=limit) # lang_query=False) items = list() for res in results[:limit]: if isExpired(res) and getattr(res, 'outdated', False): continue try: items.append(res.getObject()) except Exception: pass return items
def get_event_list(self, start=None, stop=None): now = DateTime() events = (i.getObject() for i in self.get_events() if not( getattr(i, 'outdated', False) and isExpired(i))) months = [] month_info = [] old_month_year = None for event in events: start = event.start() month = str(start.month()) year = str(start.year()) month_year = year+month if month_year != old_month_year: old_month_year = month_year if month_info: months.append(month_info) month_info = { 'month': start.month(), 'year': start.year(), # e.g. month_oct as used in the plonelocales i18n:domain 'month_name': "month_%s" %( start.strftime("%B").lower()[:3] ), 'events': []} isDateToBeConfirmed = ( True if hasattr(event, "dateToBeConfirmed") and event.dateToBeConfirmed else False) isOutdated = IAnnotations(event).get("slc.outdated", False) event_dict = {'event': event, 'day': start.day(), 'start': start, 'end': event.end(), 'location': event.getLocation(), 'title': event.Title(), 'description': event.Description(), 'url': event.absolute_url(), 'is_tbc': isDateToBeConfirmed, 'is_outdated': isOutdated } month_info['events'].append(event_dict) if month_info: months.append(month_info) return months
def __call__(self): context = aq_inner(self.context) catalog = getToolByName(context, "portal_catalog") portal_languages = getToolByName(self.context, "portal_languages") preflang = portal_languages.getPreferredLanguage() # try to get query parameters from Topic (if present) query = getattr(context, "buildQuery", None) and context.buildQuery() if not query: # search in the navigation root of the currently selected language and in the English path # with Language = preferredLanguage or neutral paths = list() portal_state = getMultiAdapter((self.context, self.request), name=u"plone_portal_state") navigation_root_path = portal_state.navigation_root_path() navigation_root = portal_state.portal().restrictedTraverse(navigation_root_path) teaser = getattr(navigation_root, "teaser", None) if teaser: teaser_path = "/".join(teaser.getPhysicalPath()) paths.append(teaser_path) try: canonical_path = "/".join(teaser.getCanonical().getPhysicalPath()) paths.append(canonical_path) except: pass state = "published" now = DateTime() query = dict( portal_type="News Item", review_state=state, path=paths, effective={"query": now, "range": "max"}, expires={"query": now, "range": "min"}, sort_on="effective", sort_order="reverse", Language=["", preflang], ) items = catalog(query) self.items = [x for x in items if not (getattr(x, "outdated", False) and isExpired(x))] return self.index()
def getResults(self): context = Acquisition.aq_inner(self.context) # try to get query parameters from Topic (if present) query = hasattr(context, 'buildQuery') and context.buildQuery() if not query: # otherwise construct a query query = dict( portal_type="PressRelease", sort_on='Date', sort_order='reverse', path='/'.join(context.getPhysicalPath())) search_view = self.context.restrictedTraverse( '@@language-fallback-search') results = search_view.search(query) # filter out results that are both outdated and expired to_show = [ x for x in results if not ( getattr(x, 'outdated', False) and isExpired(x)) ] return to_show
def _get_issues(self): " fetch all oshmail issues " folder = self.context.data.oshmail pc = self.context.portal_catalog yearmap = dict() allissues = [] latestissue = None for issue in pc(portal_type='Collage', review_state="published"): if not 'oshmail' in issue['getId']: continue # Don't list OSHMails that are both expired and outdated, # aka "deleted" if getattr(issue, 'outdated', False) and isExpired(issue): continue date = issue['effective'] if latestissue is None or date > latestissue['effective']: latestissue = issue (name, num) = issue['getId'].split('-') yearlist = yearmap.get(date.year(), []) yearlist.append((int(num), dict(id=issue['getId'], day=date.Day(), month=date.Month(), year=date.year(), url=issue.getURL(), title=issue['Title']) )) yearmap[date.year()] = yearlist ordered_yearmap = OrderedDict() years = yearmap.keys() years.sort() years.reverse() for year in years: yearlist = yearmap[year] yearlist.sort() yearlist.reverse() ordered_yearmap[year] = yearlist return latestissue, ordered_yearmap
def _get_issues(self): " fetch all oshmail issues " folder = self.context.data.oshmail pc = self.context.portal_catalog yearmap = dict() allissues = [] latestissue = None for issue in pc(portal_type='Collage', review_state="published"): if not 'oshmail' in issue['getId']: continue # Don't list OSHMails that are both expired and outdated, # aka "deleted" if getattr(issue, 'outdated', False) and isExpired(issue): continue date = issue['effective'] if latestissue is None or date > latestissue['effective']: latestissue = issue (name, num) = issue['getId'].split('-') yearlist = yearmap.get(date.year(), []) yearlist.append((int(num), dict(id=issue['getId'], day=date.Day(), month=date.Month(), year=date.year(), url=issue.getURL(), title=issue['Title']))) yearmap[date.year()] = yearlist ordered_yearmap = OrderedDict() years = yearmap.keys() years.sort() years.reverse() for year in years: yearlist = yearmap[year] yearlist.sort() yearlist.reverse() ordered_yearmap[year] = yearlist return latestissue, ordered_yearmap
def getResults(self): context = Acquisition.aq_inner(self.context) # try to get query parameters from Topic (if present) query = hasattr(context, 'buildQuery') and context.buildQuery() if not query: # otherwise construct a query query = dict(portal_type="PressRelease", sort_on='Date', sort_order='reverse', path='/'.join(context.getPhysicalPath())) search_view = self.context.restrictedTraverse( '@@language-fallback-search') results = search_view.search(query) # filter out results that are both outdated and expired to_show = [ x for x in results if not (getattr(x, 'outdated', False) and isExpired(x)) ] return to_show
def testPublishingSubobjectsAndExpireThem(self): self.setRoles(['Manager']) # Make sure we can publish directly self.folder.invokeFactory('Document', id='d1', title='Doc 1') self.folder.invokeFactory('Folder', id='f1', title='Folder 1') self.folder.f1.invokeFactory('Document', id='d2', title='Doc 2') self.folder.f1.invokeFactory('Folder', id='f2', title='Folder 2') paths = [] for o in (self.folder.d1, self.folder.f1): paths.append('/'.join(o.getPhysicalPath())) # folder_publish requires a non-GET request self.setRequestMethod('POST') self.folder.folder_publish(workflow_action='publish', paths=paths, effective_date='1/1/2001', expiration_date='1/2/2001', include_children=True) for o in (self.folder.d1, self.folder.f1, self.folder.f1.d2, self.folder.f1.f2): self.assertEqual(self.workflow.getInfoFor(o, 'review_state'), 'published') self.assertTrue(isExpired(o))
def isExpired(self, content): return isExpired(content)
def items(self): plone_utils = getToolByName(self.context, 'plone_utils') portal_url = getToolByName(self.context, 'portal_url') plone_view = getMultiAdapter((self.context, self.request), name=u'plone') plone_layout = getMultiAdapter((self.context, self.request), name=u'plone_layout') portal_workflow = getToolByName(self.context, 'portal_workflow') portal_types = getToolByName(self.context, 'portal_types') portal_membership = getToolByName(self.context, 'portal_membership') registry = getUtility(IRegistry) use_view_action = registry.get( 'plone.types_use_view_action_in_listings', ()) browser_default = plone_utils.browserDefault(self.context) results = list() if portal_membership.isAnonymousUser(): worklist = [] else: worklist = portal_workflow.getWorklistsResults() for i, obj in enumerate(worklist): if i % 2 == 0: table_row_class = "even" else: table_row_class = "odd" url = obj.absolute_url() path = '/'.join(obj.getPhysicalPath()) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = portal_workflow.getInfoFor(obj, 'review_state', '') state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = portal_url.getRelativeContentURL(obj) type_title_msgid = portal_types[obj.portal_type].Title() url_href_title = u'%s: %s' % (translate(type_title_msgid, context=self.request), safe_unicode(obj.Description())) getMember = getToolByName(obj, 'portal_membership').getMemberById creator_id = obj.Creator() creator = getMember(creator_id) if creator: creator_name = creator.getProperty('fullname', '') or creator_id else: creator_name = creator_id modified = ''.join(map(safe_unicode, [ creator_name, ' - ', plone_view.toLocalizedTime(obj.ModificationDate(), long_format=1)])) is_structural_folder = obj.restrictedTraverse( '@@plone').isStructuralFolder() if obj.portal_type in use_view_action: view_url = url + '/view' elif is_structural_folder: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len(browser_default[1]) == 1 and ( obj.id == browser_default[1][0]) results.append(dict( url=url, url_href_title=url_href_title, id=obj.getId(), quoted_id=quote_plus(obj.getId()), path=path, title_or_id=obj.pretty_title_or_id(), description=obj.Description(), obj_type=obj.Type, size=human_readable_size(obj.get_size()), modified=modified, type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType( review_state, obj.portal_type), state_class=state_class, is_browser_default=is_browser_default, folderish=is_structural_folder, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=isExpired(obj) )) return results
def __call__(self): log.info("Called CleanupContent") cnt = 0 action = self.request.get("action", "") if not action: return "No 'action' parameter supplied" if type(action) == str: action = [action] for act in action: if not act in ALLOWED_ACTIONS: return "Invalid parameter for 'action'. Potential values: " "%s" % ", ".join(ALLOWED_ACTIONS) # threshold = self.request.get('threshold', '') # try: # date = DateTime(threshold) # except: # date = None # if not threshold or not date: # return "No valid value for parameter 'threshold' supplied. It " \ # "must represent a date" min_days = self.request.get("min_days", "") try: min_days = int(min_days) except: min_days = None if not min_days: return ( "You must supply a 'min_days' parameter, to indicate the " "minimum age in days a content item must have to be considered" ) date = DateTime() - min_days portal_type = self.request.get("portal_type", "") if portal_type not in ALLOWED_TYPES: return "You must supply a parameter 'portal_type'. Potential " "values: %s" % ", ".join(ALLOWED_TYPES) plt = getToolByName(self, "portal_languages") lang = plt.getPreferredLanguage() catalog = getToolByName(self, "portal_catalog") parent_path = "/".join(self.context.getPhysicalPath()) query = dict(Language=[lang, ""], portal_type=portal_type, path=dict(query=parent_path, depth=-1)) date_param = dict(query=date, range="max") if portal_type in ("News Item", "PressRelease", "Collage"): query["effective"] = date_param elif portal_type == "Event": query["end"] = date_param else: query["modified"] = date_param async = getUtility(IAsyncService) results = catalog(**query) for res in results: force_reindex = False remove_links = False for act in action: job = None if act == "delete": job = async.queueJob(delete_item, self.context, parent_path, res.id) remove_links = True elif act == "make_private": job = async.queueJob(make_private, self.context, res.getPath()) remove_links = True elif act == "make_expired": # save work: don't do nuthin if it ain't needed if not isExpired(res): job = async.queueJob(make_expired, self.context, res.getPath()) force_reindex = True remove_links = True elif act == "make_outdated": # save work: don't do nuthin if it ain't needed if not getattr(res, "outdated", False): job = async.queueJob(make_outdated, self.context, res.getPath()) force_reindex = True remove_links = True if job is not None: job.addCallbacks(failure=job_failure_callback) cnt += 1 if force_reindex: job = async.queueJob(reindex, self.context, res.getPath()) job.addCallbacks(failure=job_failure_callback) if remove_links: job = async.queueJob(lms_remove_links, self.context, res.getPath()) job.addCallbacks(failure=job_failure_callback) msg = "Handled a total of %d items of type '%s', action '%s'" % (cnt, portal_type, action) log.info(msg) return msg
def items(self): plone_utils = getToolByName(self.context, 'plone_utils') portal_url = getToolByName(self.context, 'portal_url') plone_view = getMultiAdapter((self.context, self.request), name='plone') portal_workflow = getToolByName(self.context, 'portal_workflow') portal_types = getToolByName(self.context, 'portal_types') portal_membership = getToolByName(self.context, 'portal_membership') registry = getUtility(IRegistry) use_view_action = registry.get( 'plone.types_use_view_action_in_listings', ()) browser_default = plone_utils.browserDefault(self.context) results = list() if portal_membership.isAnonymousUser(): worklist = [] else: worklist = portal_workflow.getWorklistsResults() for i, obj in enumerate(worklist): if i % 2 == 0: table_row_class = "even" else: table_row_class = "odd" url = obj.absolute_url() path = '/'.join(obj.getPhysicalPath()) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = portal_workflow.getInfoFor(obj, 'review_state', '') state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = portal_url.getRelativeContentURL(obj) type_title_msgid = portal_types[obj.portal_type].Title() url_href_title = '{}: {}'.format(translate(type_title_msgid, context=self.request), safe_unicode(obj.Description())) getMember = getToolByName(obj, 'portal_membership').getMemberById creator_id = obj.Creator() creator = getMember(creator_id) if creator: creator_name = creator.getProperty('fullname', '') or creator_id else: creator_name = creator_id modified = ''.join(map(safe_unicode, [ creator_name, ' - ', plone_view.toLocalizedTime(obj.ModificationDate(), long_format=1)])) is_structural_folder = obj.restrictedTraverse( '@@plone').isStructuralFolder() if obj.portal_type in use_view_action: view_url = url + '/view' elif is_structural_folder: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len(browser_default[1]) == 1 and ( obj.id == browser_default[1][0]) results.append(dict( url=url, url_href_title=url_href_title, id=obj.getId(), quoted_id=quote_plus(obj.getId()), path=path, title_or_id=obj.pretty_title_or_id(), description=obj.Description(), obj_type=obj.Type, size=human_readable_size(obj.get_size()), modified=modified, type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType( review_state, obj.portal_type), state_class=state_class, is_browser_default=is_browser_default, folderish=is_structural_folder, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=isExpired(obj) )) return results
def testIsExpiredWithExplicitNonExpiredContent(self): self.setRoles(['Manager']) self.folder.invokeFactory('Document', id='d1', title='Doc 1') self.folder.d1.content_status_modify(workflow_action='publish') self.assertFalse(isExpired(self.folder.d1))
def isExpired(self, content): return isExpired(content)
def folderitems(self): """ """ context = aq_inner(self.context) plone_utils = getToolByName(context, 'plone_utils') plone_view = getMultiAdapter((context, self.request), name=u'plone') plone_layout = getMultiAdapter((context, self.request), name=u'plone_layout') portal_workflow = getToolByName(context, 'portal_workflow') portal_properties = getToolByName(context, 'portal_properties') portal_types = getToolByName(context, 'portal_types') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty( 'typesUseViewActionInListings', ()) browser_default = plone_utils.browserDefault(context) contentsMethod = self.contentsMethod() show_all = self.request.get('show_all', '').lower() == 'true' pagesize = 20 pagenumber = int(self.request.get('pagenumber', 1)) start = (pagenumber - 1) * pagesize end = start + pagesize results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): path = obj.getPath or "/".join(obj.getPhysicalPath()) # avoid creating unnecessary info for items outside the current # batch; only the path is needed for the "select all" case... # Include brain to make customizations easier (see comment below) if not show_all and not start <= i < end: results.append(dict(path=path, brain=obj)) continue if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = obj.getURL() icon = plone_layout.getIcon(obj) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = obj.review_state state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = obj.getURL(relative=True) fti = portal_types.get(obj.portal_type) if fti is not None: type_title_msgid = fti.Title() else: type_title_msgid = obj.portal_type url_href_title = u'%s: %s' % (translate(type_title_msgid, context=self.request), safe_unicode(obj.Description)) modified = plone_view.toLocalizedTime(obj.ModificationDate, long_format=1) if obj.portal_type in use_view_action: view_url = url + '/view' elif obj.is_folderish: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len( browser_default[1]) == 1 and (obj.id == browser_default[1][0]) results.append( dict( # provide the brain itself to allow cleaner customisation of # the view. # # this doesn't add any memory overhead, a reference to # the brain is already kept through its getPath bound method. brain=obj, url=url, url_href_title=url_href_title, id=obj.getId, quoted_id=urllib.quote_plus(obj.getId), path=path, title_or_id=safe_unicode( pretty_title_or_id(plone_utils, obj)), obj_type=obj.Type, size=obj.getObjSize, modified=modified, icon=icon.html_tag(), type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType( review_state, obj.portal_type), state_class=state_class, is_browser_default=is_browser_default, folderish=obj.is_folderish, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=isExpired(obj), )) return results
## Script (Python) "isExpired" ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##parameters=content=None ##title=Find out if the object is expired ## from Products.CMFPlone.utils import isExpired if not content: content = context return isExpired(content)
def folderItems(self): """ """ context = aq_inner(self.context) ploneUtils = getToolByName(context, 'plone_utils') ploneView = getMultiAdapter((context, self.request), name=u'plone') ploneLayout = getMultiAdapter((context, self.request), name=u'plone_layout') portalWorkflow = getToolByName(context, 'portal_workflow') portalTypes = getToolByName(context, 'portal_types') portalMembership = getToolByName(context, 'portal_membership') browser_default = ploneUtils.browserDefault(context) contentsMethod = self.contentsMethod() start = 0 end = start + self.pagesize results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): path = obj.getPath() or "/".join(obj.getPhysicalPath()) # avoid creating unnecessary info for items outside the current # batch; only the path is needed for the "select all" case... if not self.selectAll and not self.showAll and not start <= i < end: results.append(dict(path = path)) continue url = obj.getURL() viewUrl = url + "/cmsui-structure" fti = portalTypes.get(obj.portal_type) if fti is not None: typeTitleMsgid = fti.Title() else: typeTitleMsgid = obj.portal_type urlHrefTitle = u'%s: %s' % (translate(typeTitleMsgid, context=self.request), safe_unicode(obj.Description)) creator = obj.Creator memberInfo = portalMembership.getMemberInfo(creator) creator = memberInfo.get('fullname', '') or creator modified = ploneView.toLocalizedTime( obj.ModificationDate, long_format=1) isBrowserDefault = len(browser_default[1]) == 1 and ( obj.id == browser_default[1][0]) results.append(dict( url = url, urlHrefTitle = urlHrefTitle, id = obj.getId, quotedId = urllib.quote_plus(obj.getId), path = path, titleOrId = safe_unicode(pretty_title_or_id(ploneUtils, obj)), creator = creator, modified = modified, icon = ploneLayout.getIcon(obj).html_tag(), typeClass = 'contenttype-' + ploneUtils.normalizeString(obj.portal_type), wf_state = obj.review_state, stateTitle = portalWorkflow.getTitleForStateOnType(obj.review_state, obj.Type), stateClass = 'state-' + ploneUtils.normalizeString(obj.review_state), isBrowserDefault = isBrowserDefault, folderish = obj.is_folderish, viewUrl = viewUrl, isExpired = isExpired(obj), )) return results
def folderitems(self): """ """ context = aq_inner(self.context) plone_utils = getToolByName(context, 'plone_utils') plone_view = getMultiAdapter((context, self.request), name=u'plone') plone_layout = getMultiAdapter((context, self.request), name=u'plone_layout') portal_workflow = getToolByName(context, 'portal_workflow') portal_properties = getToolByName(context, 'portal_properties') portal_types = getToolByName(context, 'portal_types') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty('typesUseViewActionInListings', ()) browser_default = plone_utils.browserDefault(context) contentsMethod = self.contentsMethod() show_all = self.request.get('show_all', '').lower() == 'true' pagesize = 20 pagenumber = int(self.request.get('pagenumber', 1)) start = (pagenumber - 1) * pagesize end = start + pagesize results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): path = obj.getPath or "/".join(obj.getPhysicalPath()) # avoid creating unnecessary info for items outside the current # batch; only the path is needed for the "select all" case... # Include brain to make customizations easier (see comment below) if not show_all and not start <= i < end: results.append(dict(path=path, brain=obj)) continue if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = obj.getURL() icon = plone_layout.getIcon(obj) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = obj.review_state state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = obj.getURL(relative=True) fti = portal_types.get(obj.portal_type) if fti is not None: type_title_msgid = fti.Title() else: type_title_msgid = obj.portal_type url_href_title = u'%s: %s' % (translate(type_title_msgid, context=self.request), safe_unicode(obj.Description)) modified = plone_view.toLocalizedTime( obj.ModificationDate, long_format=1) modified_sortable = 'sortabledata-' + obj.modified.strftime( '%Y-%m-%d-%H-%M-%S') if obj.portal_type in use_view_action: view_url = url + '/view' elif obj.is_folderish: view_url = url + "/repo_folder_contents" else: view_url = url imageObject = obj.getObject() if imageObject.portal_type == 'Image': image = imageObject.tag(scale="thumb") else: image = None is_browser_default = len(browser_default[1]) == 1 and ( obj.id == browser_default[1][0]) results.append(dict( # provide the brain itself to allow cleaner customisation of # the view. # # this doesn't add any memory overhead, a reference to # the brain is already kept through its getPath bound method. brain = obj, url = url, url_href_title = url_href_title, id = obj.getId, quoted_id = urllib.quote_plus(obj.getId), path = path, title_or_id = safe_unicode(pretty_title_or_id(plone_utils, obj)), obj_type = obj.Type, size = obj.getObjSize, modified = modified, modified_sortable = modified_sortable, icon = icon.html_tag(), type_class = type_class, wf_state = review_state, state_title = portal_workflow.getTitleForStateOnType(review_state, obj.portal_type), state_class = state_class, is_browser_default = is_browser_default, folderish = obj.is_folderish, relative_url = relative_url, view_url = view_url, table_row_class = table_row_class, is_expired = isExpired(obj), image = image, )) return results
def folderitems(self): """ """ context = aq_inner(self.context) plone_utils = getToolByName(context, 'plone_utils') plone_view = getMultiAdapter((context, self.request), name=u'plone') plone_layout = queryMultiAdapter( (context, self.request), name=u'plone_layout', default=plone_view) portal_workflow = getToolByName(context, 'portal_workflow') portal_properties = getToolByName(context, 'portal_properties') portal_types = getToolByName(context, 'portal_types') site_properties = portal_properties.site_properties use_view_action = site_properties.getProperty( 'typesUseViewActionInListings', ()) browser_default = plone_utils.browserDefault(context) contentsMethod = context.contentValues show_all = self.request.get('show_all', '').lower() == 'true' pagesize = 20 pagenumber = int(self.request.get('pagenumber', 1)) start = (pagenumber - 1) * pagesize end = start + pagesize results = [] for i, obj in enumerate(contentsMethod(self.contentFilter)): path = ( getattr(obj, 'getPath', False) or "/".join(obj.getPhysicalPath())) # avoid creating unnecessary info for items outside the current # batch; only the path is needed for the "select all" case... if not show_all and not start <= i < end: results.append(dict(path=path)) continue if (i + 1) % 2 == 0: table_row_class = "draggable even" else: table_row_class = "draggable odd" url = obj.absolute_url() icon = plone_layout.getIcon(obj) type_class = 'contenttype-' + plone_utils.normalizeString( obj.portal_type) review_state = portal_workflow.getInfoFor(obj, 'review_state') state_class = 'state-' + plone_utils.normalizeString(review_state) relative_url = obj.absolute_url(relative=True) fti = portal_types.get(obj.portal_type) if fti is not None: type_title_msgid = fti.Title() else: type_title_msgid = obj.portal_type url_href_title = u'%s: %s' % (translate(type_title_msgid, context=self.request), safe_unicode(obj.Description())) modified = plone_view.toLocalizedTime( obj.ModificationDate(), long_format=1) obj_type = obj.Type() is_folderish = getattr( aq_base(obj), 'isPrincipiaFolderish', False) if obj_type in use_view_action: view_url = url + '/view' elif is_folderish: view_url = url + "/folder_contents" else: view_url = url is_browser_default = len(browser_default[1]) == 1 and ( obj.id == browser_default[1][0]) results.append(dict( url=url, url_href_title=url_href_title, id=obj.getId(), quoted_id=urllib.quote_plus(obj.getId()), path=path, title_or_id=safe_unicode(pretty_title_or_id(plone_utils, obj)), obj_type=obj_type, size=obj.getObjSize, modified=modified, icon=icon.html_tag(), type_class=type_class, wf_state=review_state, state_title=portal_workflow.getTitleForStateOnType( review_state, obj_type), state_class=state_class, is_browser_default=is_browser_default, folderish=is_folderish, relative_url=relative_url, view_url=view_url, table_row_class=table_row_class, is_expired=isExpired(obj), )) return results