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
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
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()
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
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()
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)
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
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))