コード例 #1
0
ファイル: oshnews_view.py プロジェクト: syslabcom/osha.theme
    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')
コード例 #2
0
 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))
コード例 #3
0
ファイル: oshnews_view.py プロジェクト: EU-OSHA/osha.theme
    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')
コード例 #4
0
    def expired(self, brain):
        if brain.portal_type not in ['News Item', 'Link', 'Event']:
            return False

        if isExpired(brain) == 1:
            return True

        return False
コード例 #5
0
ファイル: viewlets.py プロジェクト: EU-OSHA/osha.theme
 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()
コード例 #6
0
ファイル: viewlets.py プロジェクト: syslabcom/osha.theme
 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()
コード例 #7
0
ファイル: homepage.py プロジェクト: eea/land.copernicus.theme
    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]
コード例 #8
0
    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]
コード例 #9
0
    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()
コード例 #10
0
ファイル: jsonfeed.py プロジェクト: syslabcom/osha.policy
    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
コード例 #11
0
    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)
コード例 #12
0
ファイル: jsonfeed.py プロジェクト: EU-OSHA/osha.policy
    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
コード例 #13
0
    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))
コード例 #14
0
ファイル: misc.py プロジェクト: eea/eea.climateadapt.plone
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()
コード例 #15
0
    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
コード例 #16
0
    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
コード例 #17
0
ファイル: oshnews.py プロジェクト: EU-OSHA/osha.theme
    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
コード例 #18
0
    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
コード例 #19
0
ファイル: teaserview.py プロジェクト: EU-OSHA/osha.theme
    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()
コード例 #20
0
ファイル: pressroom.py プロジェクト: EU-OSHA/osha.theme
    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
コード例 #21
0
ファイル: oshmail_view.py プロジェクト: EU-OSHA/osha.theme
    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
コード例 #22
0
ファイル: oshmail_view.py プロジェクト: syslabcom/osha.theme
    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
コード例 #23
0
    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
コード例 #24
0
    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))
コード例 #25
0
 def isExpired(self, content):
     return isExpired(content)
コード例 #26
0
ファイル: reviewlist.py プロジェクト: plone/plone.app.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
コード例 #27
0
    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
コード例 #28
0
    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
コード例 #29
0
 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))
コード例 #30
0
 def isExpired(self, content):
     return isExpired(content)
コード例 #31
0
    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
コード例 #32
0
## 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)
コード例 #33
0
    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
コード例 #34
0
    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
コード例 #35
0
    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