コード例 #1
0
ファイル: archive.py プロジェクト: araymund/karl
def archive_calendar(community):
    folder = ArchiveFolder()
    calendar = community['calendar']
    events = []
    event_objects = (event for event in calendar.values()
                     if ICalendarEvent.providedBy(event))
    for event in sorted(event_objects, key=attrgetter('startDate')):
        record = {
            'title': event.title,
            'startDate': str(event.startDate),
            'endDate': str(event.endDate),
            'location': event.location,
            'attendees': '; '.join(event.attendees),
            'contact_name': event.contact_name,
            'contact_email': event.contact_email,
            'creator': get_author(event),
            'text': event.text if event.text else '',
        }
        record['attachments'] = attachments = []
        for attachment in event['attachments'].values():
            attachments.append({
                'title': attachment.title,
                'url': attachment.filename,
            })
            folder[attachment.filename] = attachment.blobfile

        events.append(record)

    folder['index.html'] = ArchiveTemplate('templates/archive_calendar.pt',
                                           community=community,
                                           events=events)

    return folder
コード例 #2
0
ファイル: archive.py プロジェクト: karlproject/karl
def archive_calendar(community):
    folder = ArchiveFolder()
    calendar = community['calendar']
    events = []
    event_objects = (event for event in calendar.values()
                     if ICalendarEvent.providedBy(event))
    for event in sorted(event_objects, key=attrgetter('startDate')):
        record = {
            'title': event.title,
            'startDate': str(event.startDate),
            'endDate': str(event.endDate),
            'location': event.location,
            'attendees': '; '.join(event.attendees),
            'contact_name': event.contact_name,
            'contact_email': event.contact_email,
            'creator': get_author(event),
            'text': event.text if event.text else '',
        }
        record['attachments'] = attachments = []
        for attachment in event['attachments'].values():
            attachments.append({
                'title': attachment.title,
                'url': attachment.filename,
            })
            folder[attachment.filename] = attachment.blobfile

        events.append(record)

    folder['index.html'] = ArchiveTemplate(
        'templates/archive_calendar.pt',
        community=community,
        events=events)

    return folder
コード例 #3
0
ファイル: stats.py プロジェクト: cguardia/karl
        def count(node):
            from repoze.bfg.traversal import model_path
            if IWikiPage.providedBy(node):
                stats['wiki_pages'] += 1
            elif IBlogEntry.providedBy(node):
                stats['blog_entries'] += 1
            elif IComment.providedBy(node):
                stats['comments'] += 1
            elif ICommunityFile.providedBy(node):
                stats['files'] += 1
            elif ICalendarEvent.providedBy(node):
                stats['calendar_events'] += 1

            created = getattr(node, 'created', None)
            if created is not None and now - created < THIRTY_DAYS:
                creator = getattr(node, 'creator', None)
                if creator is not None:
                    if creator not in active_users:
                        active_users[creator] = 1
                    else:
                        active_users[creator] += 1

            if hasattr(node, '__getitem__') and hasattr(node, 'values'):
                for child in node.values():
                    count(child)

            if hasattr(node, '_p_deactivate'):
                node._p_deactivate()
コード例 #4
0
ファイル: adapters.py プロジェクト: boothead/karl
    def __call__(self, default=None):
        # The layouts are by identifier, e.g. layout='community'

        # A series of tests, in order of precedence.
        layout = None
        if default is not None:
            layout = getattr(self, default+'_layout')
        intranet = find_interface(self.context, IIntranet)

        # Group a series of intranet-oriented decisions
        if intranet:
            # First, when under an intranet, OSI wants forums to get
            # the generic layout.
            if find_interface(self.context, IForum):
                layout = getattr(self, 'generic_layout')

            # Now for an intranet.  Everything gets the two-column
            # view except the intranet home page, which gets the 3
            # column treatment.
            else:
                layout = getattr(self, 'intranet_layout')

        elif find_interface(self.context, IIntranets):
            if find_interface(self.context, IForum):
                layout = getattr(self, 'generic_layout')
            elif ICalendarEvent.providedBy(self.context):
                layout = getattr(self, 'generic_layout')
            elif INetworkNewsMarker.providedBy(self.context):
                layout = getattr(self, 'generic_layout')
            elif find_interface(self.context, IReferencesFolder):
                layout = getattr(self, 'generic_layout')
            elif INetworkEventsMarker.providedBy(self.context):
                layout = getattr(self, 'generic_layout')

        return layout
コード例 #5
0
        def count(node):
            from pyramid.traversal import resource_path
            if IWikiPage.providedBy(node):
                stats['wiki_pages'] += 1
            elif IBlogEntry.providedBy(node):
                stats['blog_entries'] += 1
            elif IComment.providedBy(node):
                stats['comments'] += 1
            elif ICommunityFile.providedBy(node):
                stats['files'] += 1
            elif ICalendarEvent.providedBy(node):
                stats['calendar_events'] += 1

            created = getattr(node, 'created', None)
            if created is not None and now - created < THIRTY_DAYS:
                creator = getattr(node, 'creator', None)
                if creator is not None:
                    if creator not in active_users:
                        active_users[creator] = 1
                    else:
                        active_users[creator] += 1

            if hasattr(node, '__getitem__') and hasattr(node, 'values'):
                for child in node.values():
                    count(child)

            if hasattr(node, '_p_deactivate'):
                node._p_deactivate()
コード例 #6
0
ファイル: generate_stats.py プロジェクト: boothead/karl
    def visit(self, context):
        if ICommunity.providedBy(context):
            self.community = context
            self.row = {
                'community': context.title,
                'id': context.__name__,
                'is_private': is_private(context),
                'members': len(context.member_names),
                'moderators': len(context.moderator_names),
                'last_activity': context.content_modified,
                'create_date': context.created,
                'wiki_pages': 0,
                'blog_entries': 0,
                'blog_comments': 0,
                'files': 0,
                'calendar_events': 0,
                'community_tags': set(),
                'hits_this_month': 'Unknown',
                'percent_engaged': 'Unknown'
                }

        elif self.community is None:
            return

        else:
            last_activity = getattr(context, 'content_modified', None)
            if (last_activity is not None and
                last_activity > self.row['last_activity']):
                self.row['last_activity'] = last_activity

        if IWikiPage.providedBy(context):
            self.row['wiki_pages'] += 1
        elif IBlogEntry.providedBy(context):
            self.row['blog_entries'] += 1
        elif IComment.providedBy(context):
            self.row['blog_comments'] += 1
        elif ICommunityFile.providedBy(context):
            self.row['files'] += 1
        elif ICalendarEvent.providedBy(context):
            self.row['calendar_events'] += 1

        tags = find_tags(context)
        docid = getattr(context, 'docid', None)
        if docid is not None:
            for tag in tags.getTags([docid,]):
                self.row['community_tags'].add(tag)
コード例 #7
0
    def __call__(self, default=None):
        # The layouts are by identifier, e.g. layout='community'

        # A series of tests, in order of precedence.
        layout = None
        if default is not None:
            layout = getattr(self, default + '_layout')
        intranet = find_interface(self.context, IIntranet)

        # Group a series of intranet-oriented decisions
        if intranet:
            # First, when under an intranet, OSI wants forums to get
            # the generic layout.
            if find_interface(self.context, IForum):
                layout = getattr(self, 'generic_layout')

            # Now for an intranet.  Everything gets the two-column
            # view except the intranet home page, which gets the 3
            # column treatment.
            else:
                layout = getattr(self, 'intranet_layout')

        elif find_interface(self.context, IIntranets):
            if find_interface(self.context, IForum):
                layout = self.generic_layout
            elif ICalendarEvent.providedBy(self.context):
                layout = self.generic_layout
            elif INetworkNewsMarker.providedBy(self.context):
                layout = self.generic_layout
            elif find_interface(self.context, IReferencesFolder):
                layout = self.generic_layout
            elif INetworkEventsMarker.providedBy(self.context):
                layout = self.generic_layout

        elif not find_interface(self.context, ICommunity):
            # If we're not in a community or an intranet we need to use the
            # generic layout.
            layout = self.generic_layout

        return layout
コード例 #8
0
def scrub(site):
    """
    Given root, find content with HTML body, look for bad links or other
    errors.

    """

    searcher = ICatalogSearch(site)
    total, docids, resolver = searcher(interfaces=[IContent], )

    log.info("Found a total of %d documents", total)
    for docid in docids:
        doc = resolver(docid)

        if not hasattr(doc, 'text'):
            continue

        path = model_path(doc)
        log.debug("Checking %s", path)

        text = doc.text

        if not text:
            # Some types we're expecting not to have text, so don't warn
            # about those
            if not (ICommunity.providedBy(doc)
                    or ICalendarEvent.providedBy(doc)):
                log.warn("No text: %s %s", type(doc), path)
            continue

        try:
            try:
                # Will throw ParserError if fragment doesn't have a single
                # root element.
                html = fragment_fromstring(doc.text)
            except ParserError:
                # Wrap in a single div to make the parser happy
                html = fragment_fromstring('<div>%s</div>' % doc.text)

        except XMLSyntaxError:
            log.error("Unparseable: %s", path, exc_info=True)

        # Check and fix links
        def callback(link):
            fixed = _rewrite_link(site, path, link)
            if fixed != link:
                log.info("Link rewritten at %s", path)
                log.info("Old link: %s", link)
                log.info("New link: %s", fixed)

            if not isinstance(fixed, unicode):
                fixed = unicode(fixed, 'utf-8')

            return fixed

        html.rewrite_links(callback)

        # Need to also change any instances of the 'mce_href' attribute to
        # match newly rewritten 'href' attribute.
        for element in html.getiterator():
            if 'mce_href' in element.keys():
                element.set('mce_href', element.get('href'))

        doc.text = unicode(lxml.html.tostring(html, 'utf-8'), 'utf-8')

    log.info("Done.")
    log.info("Unknown schemes: %s", ', '.join(unknown_schemes))