def test_client_json_data(self): from karl.views.utils import convert_to_script client_json_data = {} injection = convert_to_script(client_json_data) self.assertEqual(injection, '') client_json_data = { 'widget1': {'aa':1, 'bb': [2, 3]}, 'widget2': ['cc', 'dd', {'ee': 4, 'ff':5}], } injection = convert_to_script(client_json_data) from textwrap import dedent self.assertEqual(injection, dedent("""\ <script type="text/javascript"> window.karl_client_data = {"widget2": ["cc", "dd", {"ee": 4, "ff": 5}], "widget1": {"aa": 1, "bb": [2, 3]}}; </script>"""))
def report_view(context, request): api = TemplateAPI(context, request, context.title) peopledir = find_peopledirectory(context) section = context.__parent__ peopledir_tabs = get_tabs(peopledir, request, section.__name__) client_json_data = {"grid_data": get_grid_data(context, request)} descriptions = get_report_descriptions(context) mgr = ILetterManager(context) letter_info = mgr.get_info(request) kw, qualifiers = get_search_qualifiers(request) print_url = resource_url(context, request, "print.html", **kw) csv_url = resource_url(context, request, "csv", **kw) pictures_url = resource_url(context, request, "picture_view.html", **kw) opensearch_url = resource_url(context, request, "opensearch.xml") return dict( api=api, peopledir=peopledir, peopledir_tabs=peopledir_tabs, head_data=convert_to_script(client_json_data), descriptions=descriptions, letters=letter_info, print_url=print_url, csv_url=csv_url, pictures_url=pictures_url, qualifiers=qualifiers, opensearch_url=opensearch_url, actions=get_actions(context, request), mailto=_get_mailto(context, peopledir), )
def viewall_referencemanual_view(context, request): backto = { 'href': model_url(context.__parent__, request), 'title': context.__parent__.title, } page_title = context.title api = TemplateAPI(context, request, page_title) # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('intranet') # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) return render_template_to_response( 'templates/viewall_referencemanual.pt', api=api, actions=[], head_data=convert_to_script(client_json_data), sections=_get_viewall(context, request, api), backto=backto, layout=layout, )
def report_view(context, request): client_json_data = { 'grid_data': get_grid_data(context, request), } api = TemplateAPI(context, request, context.title) peopledir = find_peopledirectory(context) section = context.__parent__ peopledir_tabs = get_tabs(peopledir, request, section.__name__) mgr = ILetterManager(context) letter_info = mgr.get_info(request) kw, qualifiers = get_search_qualifiers(request) descriptions = get_report_descriptions(context) print_url = model_url(context, request, 'print.html', **kw) csv_url = model_url(context, request, 'csv', **kw) pictures_url = model_url(context, request, 'picture_view.html', **kw) opensearch_url = model_url(context, request, 'opensearch.xml') return render_template_to_response( 'templates/people_report.pt', api=api, peopledir=peopledir, peopledir_tabs=peopledir_tabs, head_data=convert_to_script(client_json_data), descriptions=descriptions, letters=letter_info, print_url=print_url, csv_url=csv_url, pictures_url=pictures_url, qualifiers=qualifiers, opensearch_url=opensearch_url, actions=get_actions(context, request), )
def reference_outline_view(context, request): # Look for moveUp or moveDown in QUERY_STRING, telling us to # reorder something status_message = None subpath = request.params.get('subpath') backto = { 'href': resource_url(context.__parent__, request), 'title': context.__parent__.title, } user_can_edit = False actions = [] if has_permission('create', context, request): addables = get_folder_addables(context, request) if addables is not None: actions.extend(addables()) if has_permission('edit', context, request): user_can_edit = True actions.append(('Edit', 'edit.html')) if subpath: direction = request.params['direction'] status_message = move_subpath(context, subpath, direction) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) page_title = context.title api = TemplateAPI(context, request, page_title) # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider() # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox=get_tags_client_data(context, request), ) previous, next = get_previous_next(context, request) api.status_message = status_message return render_to_response( 'templates/show_referencemanual.pt', dict(api=api, actions=actions, user_can_edit=user_can_edit, head_data=convert_to_script(client_json_data), tree=getTree(context, request, api), backto=backto, layout=layout, previous_entry=previous, next_entry=next), request=request, )
def show_newsitem_view(context, request): backto = { 'href': resource_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) page_title = context.title api = TemplateAPI(context, request, page_title) previous, next = get_previous_next(context, request) # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) # Display photo photo = context.get('photo') if photo is not None: photo = { "url": thumb_url(photo, request, PHOTO_DISPLAY_SIZE), } # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('generic') ux2_layout = request.layout_manager.layout ux2_layout.section_style = None return render_to_response( 'templates/show_newsitem.pt', dict(api=api, actions=actions, attachments=fetch_attachments(context['attachments'], request), formfields=api.formfields, head_data=convert_to_script(client_json_data), backto=backto, previous=previous, next=next, old_layout=layout, photo=photo), request=request, )
def show_community_view(context, request): assert ICommunity.providedBy(context), str(type(context)) user = authenticated_userid(request) page_title = 'View Community ' + context.title api = TemplateAPI(context, request, page_title) # provide client data for rendering current tags in the tagbox tagquery = getMultiAdapter((context, request), ITagQuery) client_json_data = {'tagbox': {'docid': tagquery.docid, 'records': tagquery.tagswithcounts, }, } # add tagbox to template layout = request.layout_manager.layout # inject tagbox data to panel header data panel_data = layout.head_data['panel_data'] panel_data['tagbox'] = client_json_data['tagbox'] # Filter the actions based on permission actions = [] if has_permission(MODERATE, context, request): actions.append(('Edit', 'edit.html')) # If user has permission to see this view then has permission to join. if not(user in context.member_names or user in context.moderator_names): actions.append(('Join', 'join.html')) if has_permission(DELETE_COMMUNITY, context, request): actions.append(('Delete', 'delete.html')) if has_permission(ADMINISTER, context, request): actions.append(('Advanced', 'advanced.html')) recent_items = [] recent_items_batch = get_recent_items_batch(context, request) for item in recent_items_batch["entries"]: adapted = getMultiAdapter((item, request), IGridEntryInfo) recent_items.append(adapted) feed_url = resource_url(context, request, "atom.xml") return {'api': api, 'actions': actions, 'recent_items': recent_items, 'batch_info': recent_items_batch, 'head_data': convert_to_script(client_json_data), 'feed_url': feed_url }
def show_file_view(context, request): page_title = context.title api = TemplateAPI(context, request, page_title) client_json_data = dict( tagbox = get_tags_client_data(context, request), ) actions = [] if has_permission('create', context, request): actions.append( ('Edit', 'edit.html'), ) actions.append( ('Delete', 'delete.html'), ) # If we are in an attachments folder, the backto skips the # attachments folder and goes up to the grandparent from karl.models.interfaces import IAttachmentsFolder from repoze.bfg.traversal import find_interface attachments = find_interface(context, IAttachmentsFolder) if attachments is not None: up_to = context.__parent__.__parent__ else: up_to = context.__parent__ backto = { 'href': model_url(up_to, request), 'title': up_to.title, } fileinfo = getMultiAdapter((context, request), IFileInfo) previous, next = get_previous_next(context, request) # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('community') return render_template_to_response( 'templates/show_file.pt', api=api, actions=actions, fileinfo=fileinfo, head_data=convert_to_script(client_json_data), backto=backto, previous=previous, next=next, layout=layout, )
def reference_viewall_view(context, request): backto = { 'href': resource_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] if has_permission('create', context, request): addables = get_folder_addables(context, request) if addables is not None: actions.extend(addables()) if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) page_title = context.title api = TemplateAPI(context, request, page_title) # Get a layout layout_provider = get_layout_provider(context, request) old_layout = layout_provider('intranet') # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) previous, next = get_previous_next(context, request, 'view_all.html') intranet = find_intranet(context) if intranet is not None: ux2_layout = request.layout_manager.layout ux2_layout.section_style = "none" return render_to_response( 'templates/viewall_referencemanual.pt', dict(api=api, actions=actions, head_data=convert_to_script(client_json_data), tree=getTree(context, request, api), backto=backto, old_layout=old_layout, previous_entry=previous, next_entry=next), request=request, )
def show_wikipage_view(context, request): layout = request.layout_manager.layout is_front_page = (context.__name__ == 'front_page') if is_front_page: community = find_interface(context, ICommunity) layout.page_title = '%s Community Wiki Page' % community.title backto = False else: layout.page_title = context.title backto = { 'href': resource_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] if has_permission('edit', context, request): actions.append(('Edit', resource_url(context, request, 'edit.html'))) if has_permission('delete', context, request) and not is_front_page: actions.append(('Delete', resource_url(context, request, 'delete.html'))) repo = find_repo(context) show_trash = False if not find_interface(context, IIntranets): if repo is not None and has_permission('edit', context, request): actions.append(('History', resource_url(context, request, 'history.html'))) show_trash = True if has_permission('administer', context, request): actions.append(('Advanced', resource_url(context, request, 'advanced.html'))) api = TemplateAPI(context, request, layout.page_title) client_json_data = dict( tagbox = get_tags_client_data(context, request), ) panel_data = layout.head_data['panel_data'] panel_data['tagbox'] = client_json_data['tagbox'] layout.add_portlet('recent_activity') wiki = find_interface(context, IWiki) feed_url = resource_url(wiki, request, "atom.xml") return dict( api=api, actions=actions, head_data=convert_to_script(client_json_data), feed_url=feed_url, backto=backto, is_front_page=is_front_page, show_trash=show_trash, lock_info=lock.lock_info_for_view(context, request), )
def show_newsitem_view(context, request): backto = { 'href': model_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] if has_permission('create', context, request): actions.append( ('Edit', 'edit.html') ) actions.append( ('Delete', 'delete.html'), ) page_title = context.title api = TemplateAPI(context, request, page_title) previous, next = get_previous_next(context, request) # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) # Display photo photo = context.get_photo() if photo is not None: photo = { "url": model_url(photo, request), } # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('generic') return render_template_to_response( 'templates/show_newsitem.pt', api=api, actions=actions, attachments=fetch_attachments(context['attachments'], request), formfields=api.formfields, head_data=convert_to_script(client_json_data), backto=backto, previous=previous, next=next, layout=layout, photo=photo, )
def show_page_view(context, request): backto = { 'href': resource_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) page_title = context.title api = TemplateAPI(context, request, page_title) previous, next = get_previous_next(context, request) # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) # Get a layout community = find_community(context) layout_provider = get_layout_provider(context, request) if community is not None: layout = layout_provider('community') else: layout = layout_provider('generic') ux2_layout = request.layout_manager.layout ux2_layout.section_style = "none" return render_to_response( 'templates/show_page.pt', dict(api=api, actions=actions, attachments=fetch_attachments(context['attachments'], request), formfields=api.formfields, head_data=convert_to_script(client_json_data), backto=backto, previous_entry=previous, next_entry=next, old_layout=layout), request = request, )
def show_blogentry_view(context, request): post_url = resource_url(context, request, "comments", "add_comment.html") workflow = get_workflow(IBlogEntry, 'security', context) if workflow is None: security_states = [] else: security_states = get_security_states(workflow, context, request) page_title = context.title api = TemplateAPI(context, request, page_title) client_json_data = dict( tagbox=get_tags_client_data(context, request)) actions = [] if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('edit', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) api.is_taggable = True byline_info = getMultiAdapter((context, request), IBylineInfo) blog = find_interface(context, IBlog) backto = { 'href': resource_url(blog, request), 'title': blog.title, } comments = get_comment_data(context, context['comments'], api, request) comment_form = get_comment_form(context, context['comments'], api, request) return dict( api=api, actions=actions, comments=comments, attachments=fetch_attachments( context['attachments'], request), head_data=convert_to_script(client_json_data), comment_form=comment_form, post_url=post_url, byline_info=byline_info, backto=backto, security_states=security_states, )
def show_wikipage_view(context, request): is_front_page = (context.__name__ == 'front_page') if is_front_page: community = find_interface(context, ICommunity) page_title = '%s Community Wiki Page' % community.title backto = False else: page_title = context.title backto = { 'href': model_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('delete', context, request) and not is_front_page: actions.append(('Delete', 'delete.html')) repo = find_repo(context) if repo is not None and has_permission('edit', context, request): actions.append(('History', 'history.html')) show_trash = True else: show_trash = False if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) api = TemplateAPI(context, request, page_title) client_json_data = convert_to_script(dict( tagbox = get_tags_client_data(context, request), )) wiki = find_interface(context, IWiki) feed_url = model_url(wiki, request, "atom.xml") return dict( api=api, actions=actions, head_data=client_json_data, feed_url=feed_url, backto=backto, is_front_page=is_front_page, show_trash=show_trash, lock_info=lock.lock_info_for_view(context, request), )
def show_community_view(context, request): assert ICommunity.providedBy(context), str(type(context)) user = authenticated_userid(request) page_title = 'View Community ' + context.title api = TemplateAPI(context, request, page_title) # provide client data for rendering current tags in the tagbox tagquery = getMultiAdapter((context, request), ITagQuery) client_json_data = dict( tagbox = dict( docid = tagquery.docid, records = tagquery.tagswithcounts, ), ) # Filter the actions based on permission actions = [] if has_permission(MODERATE, context, request): actions.append(('Edit', 'edit.html')) # If user has permission to see this view then has permission to join. if not(user in context.member_names or user in context.moderator_names): actions.append(('Join', 'join.html')) if has_permission(DELETE_COMMUNITY, context, request): actions.append(('Delete', 'delete.html')) recent_items = [] recent_items_batch = get_recent_items_batch(context, request) for item in recent_items_batch["entries"]: adapted = getMultiAdapter((item, request), IGridEntryInfo) recent_items.append(adapted) feed_url = model_url(context, request, "atom.xml") return render_template_to_response( 'templates/community.pt', api=api, actions=actions, recent_items=recent_items, batch_info=recent_items_batch, head_data=convert_to_script(client_json_data), feed_url=feed_url, )
def show_wikitoc_view(context, request): is_front_page = (context.__name__ == 'front_page') if is_front_page: community = find_interface(context, ICommunity) page_title = '%s Community Wiki Page' % community.title backto = False else: page_title = context.title backto = { 'href': resource_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] api = TemplateAPI(context, request, page_title) wikitoc_data = get_wikitoc_data(context, request) page_data = dict( wikitoc = wikitoc_data, ) # ... for ux1 client_json_data = convert_to_script(page_data) # ... for ux2 request.layout_manager.layout.head_data['page_data'] = page_data wiki = find_interface(context, IWiki) feed_url = resource_url(wiki, request, "atom.xml") repo = find_repo(context) show_trash = repo is not None and has_permission('edit', context, request) return dict(api=api, actions=actions, head_data=client_json_data, feed_url=feed_url, backto=backto, lock_info=lock.lock_info_for_view(context, request), show_trash=show_trash, )
def show_agility_view(context, request): backto = { 'href': model_url(context, request), 'title': context.title, } api = TemplateAPI(context, request, "Agility") client_json_data = convert_to_script(dict( wiki_url=backto["href"] )) feed_url = model_url(context, request, "atom.xml") return render_template_to_response( 'templates/show_agility2.pt', api=api, head_data=client_json_data, backto=backto, )
def render_karl_client_data(self, update_dict=None): """ How to provide data to the client? There are 3 ways: 1. specify the data via the template api api.karl_client_data['my_widget'] = {...my_data...} The code will be injected to all pages automatically. Be careful not to overwrite api.karl_client_data, only update one or more fields of the dictionary. 2. Pass the data directly to the template render_template_to_response(... ... karl_client_data = {'my_widget': {...my_data...}}, ...) The passed dictionary will update the one specified via the template api. 3. Legacy way: head_data from karl.views.utils import convert_to_script render_template_to_response(... ... head_data = convert_to_script({'my_widget': {...my_data...}), ...) Data inserted this way is supported in order to not break old code, but for new code please prefer to use the methods described in point 1. or 2. """ d = dict(self.karl_client_data) if update_dict: d.update(update_dict) return convert_to_script(d, var_name="karl_client_data")
def show_referencesection_view(context, request): backto = { 'href': model_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] if has_permission('create', context, request): addables = get_folder_addables(context, request) if addables is not None: actions.extend(addables()) actions.append(('Edit', 'edit.html')) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) page_title = context.title api = TemplateAPI(context, request, page_title) # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('intranet') previous, next = get_previous_next(context, request) # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) return render_template_to_response( 'templates/show_referencesection.pt', api=api, actions=actions, entries=_get_ordered_listing(context, request), head_data=convert_to_script(client_json_data), backto=backto, previous=previous, next=next, layout=layout, )
def render_karl_client_data(self, update_dict=None): """ How to provide data to the client? There are 3 ways: 1. specify the data via the template api api.karl_client_data['my_widget'] = {...my_data...} The code will be injected to all pages automatically. Be careful not to overwrite api.karl_client_data, only update one or more fields of the dictionary. 2. Pass the data directly to the template render_template_to_response(... ... karl_client_data = {'my_widget': {...my_data...}}, ...) The passed dictionary will update the one specified via the template api. 3. Legacy way: head_data from karl.views.utils import convert_to_script render_template_to_response(... ... head_data = convert_to_script({'my_widget': {...my_data...}), ...) Data inserted this way is supported in order to not break old code, but for new code please prefer to use the methods described in point 1. or 2. """ d = dict(self.karl_client_data) if update_dict: d.update(update_dict) return convert_to_script(d, var_name='karl_client_data')
def show_wikitoc_view(context, request): is_front_page = (context.__name__ == 'front_page') if is_front_page: community = find_interface(context, ICommunity) page_title = '%s Community Wiki Page' % community.title backto = False else: page_title = context.title backto = { 'href': resource_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] api = TemplateAPI(context, request, page_title) api.require_javascript('karl-wikitoc') api.require_css('karl-wikitoc') wikitoc_data = get_wikitoc_data(context, request) page_data = dict(wikitoc=wikitoc_data, ) client_json_data = convert_to_script(page_data) wiki = find_interface(context, IWiki) feed_url = resource_url(wiki, request, "atom.xml") repo = find_repo(context) show_trash = repo is not None and has_permission('edit', context, request) return dict( api=api, actions=actions, head_data=client_json_data, feed_url=feed_url, backto=backto, lock_info=lock.lock_info_for_view(context, request), show_trash=show_trash, )
def show_wikitoc_view(context, request): is_front_page = (context.__name__ == 'front_page') if is_front_page: community = find_interface(context, ICommunity) page_title = '%s Community Wiki Page' % community.title backto = False else: page_title = context.title backto = { 'href': model_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] api = TemplateAPI(context, request, page_title) wikitoc_data = get_wikitoc_data(context, request) client_json_data = convert_to_script(dict( wikitoc = wikitoc_data, )) wiki = find_interface(context, IWiki) feed_url = model_url(wiki, request, "atom.xml") repo = find_repo(context) show_trash = repo is not None and has_permission('edit', context, request) return render_template_to_response( 'templates/show_wikitoc.pt', api=api, actions=actions, head_data=client_json_data, feed_url=feed_url, backto=backto, show_trash=show_trash, )
def report_view(context, request, pictures=False): api = TemplateAPI(context, request, context.title) peopledir = find_peopledirectory(context) section = context.__parent__ section_name = section.__name__ while section and not IPeopleSection.providedBy(section): section = section.__parent__ if section: section_name = section.__name__ peopledir_tabs = get_tabs(peopledir, request, section_name) report_data = get_grid_data(context, request) # ux2 slickgrid only widgets = { 'peoplegrid': report_data['slickgrid_info']['widget_options'], #{ ##'loadData': [], ## search_folder(context, request, ##from_=0, ##to=_pre_fetch, ##sort_col='modified', ##sort_dir=-1, # XXX hint from ux1 ##_raw_get_container_batch=_raw_get_container_batch, #), ##'url': resource_url(context, request, 'peoplegrid.json'), #}, } batch = report_data['batch'] if pictures: rows = profile_photo_rows(batch['entries'], request, api) else: rows = None del (report_data['batch']) # non-json serializable client_json_data = {'grid_data': report_data} descriptions = get_report_descriptions(context) mgr = ILetterManager(context) letter_info = mgr.get_info(request) kw, qualifiers = get_search_qualifiers(request) print_url = resource_url(context, request, 'print.html', **kw) csv_url = resource_url(context, request, 'csv', **kw) pictures_url = resource_url(context, request, 'picture_view.html', **kw) tabular_url = resource_url(context, request, **kw) opensearch_url = resource_url(context, request, 'opensearch.xml') mailto = _get_mailto(context, peopledir) formats = [ # ux2 { 'name': 'tabular', 'selected': not pictures, 'bs-icon': 'icon-th-list', 'url': tabular_url, 'title': 'Tabular View', 'description': 'Show table' }, { 'name': 'picture', 'selected': pictures, 'bs-icon': 'icon-th', 'url': pictures_url, 'title': 'Picture View', 'description': 'Show pictures' } ] actions = [{ 'name': 'print', 'title': 'Print', 'description': 'Print this report', 'bs-icon': 'icon-print', 'url': request.resource_url(context, 'print.html') }, { 'name': 'csv', 'title': 'Export as CSV', 'description': 'Export this report as CSV', 'bs-icon': 'icon-download', 'url': request.resource_url(context, 'csv') }] if mailto: actions.insert( 0, { 'name': 'email', 'title': 'Email', 'bs-icon': 'icon-envelope', 'description': 'Email', 'url': mailto }) if opensearch_url: actions.insert( 0, { 'name': 'opensearch', 'title': 'Opensearch', 'bs-icon': 'icon-search', 'description': 'Add KARL People Search to your browser toolbar', 'url': "javascript:window.external.AddSearchProvider('%s');" % opensearch_url }) return dict( api=api, # deprecated in ux2 peopledir=peopledir, # deprecated in ux2 peopledir_tabs=peopledir_tabs, # deprecated in ux2 context_tools=peopledir_tabs, head_data=convert_to_script(client_json_data), # deprecated in ux2 report_data=report_data, # ux2 batch_info=batch, # deprecated in ux2 batch=batch, # ux2 rows=rows, descriptions=descriptions, letters=letter_info, formats=formats, # ux2 report_actions=actions, # ux2 print_url=print_url, # deprecated in ux2 csv_url=csv_url, # deprecated in ux2 pictures_url=pictures_url, # deprecated in ux2 tabular_url=tabular_url, # deprecated in ux2 qualifiers=qualifiers, # deprecated in ux2 opensearch_url=opensearch_url, # deprecated in ux2 actions=get_actions(context, request), mailto=mailto, # deprecated in ux2 widgets=widgets, # ux2 with karlgrid (slickgrid) )
def report_view(context, request, pictures=False): api = TemplateAPI(context, request, context.title) peopledir = find_peopledirectory(context) section = context.__parent__ section_name = section.__name__ while section and not IPeopleSection.providedBy(section): section = section.__parent__ if section: section_name = section.__name__ peopledir_tabs = get_tabs(peopledir, request, section_name) # make the max limit here ridiculously huge so the frontend can just deal # with rendering all of the data. this should scale fairly well up to # quite large datasets (several thousand if not tens of thousands) -- if # it starts becoming an issue, then the limit will need to be reduced, and # the client lib updated to handle the paging interaction with the backend report_data = get_grid_data(context, request, limit=2147483647) batch = report_data['batch'] if pictures: rows = profile_photo_rows(batch['entries'], request, api) else: rows = None del (report_data['batch']) # non-json serializable client_json_data = {'grid_data': report_data} descriptions = get_report_descriptions(context) mgr = ILetterManager(context) letter_info = mgr.get_info(request) kw, qualifiers = get_search_qualifiers(request) print_url = resource_url(context, request, 'print.html', **kw) csv_url = resource_url(context, request, 'csv', **kw) pictures_url = resource_url(context, request, 'picture_view.html', **kw) tabular_url = resource_url(context, request, **kw) opensearch_url = resource_url(context, request, 'opensearch.xml') mailto = _get_mailto(context, peopledir) actions = [{ 'name': 'print', 'title': 'Print', 'description': 'Print this report', 'bs-icon': 'icon-print', 'url': request.resource_url(context, 'print.html') }, { 'name': 'csv', 'title': 'Export as CSV', 'description': 'Export this report as CSV', 'bs-icon': 'icon-download', 'url': request.resource_url(context, 'csv') }] if mailto: actions.insert( 0, { 'name': 'email', 'title': 'Email', 'bs-icon': 'icon-envelope', 'description': 'Email', 'url': mailto }) if opensearch_url: actions.insert( 0, { 'name': 'opensearch', 'title': 'Opensearch', 'bs-icon': 'icon-search', 'description': 'Add KARL People Search to your browser toolbar', 'url': "javascript:window.external.AddSearchProvider('%s');" % opensearch_url }) return dict( api=api, peopledir=peopledir, peopledir_tabs=peopledir_tabs, context_tools=peopledir_tabs, batch_info=batch, head_data=convert_to_script(client_json_data), rows=rows, descriptions=descriptions, letters=letter_info, print_url=print_url, csv_url=csv_url, pictures_url=pictures_url, tabular_url=tabular_url, qualifiers=qualifiers, opensearch_url=opensearch_url, actions=get_actions(context, request), mailto=mailto, )
def show_blogentry_view(context, request): post_url = resource_url(context, request, "comments", "add_comment.html") karldates = getUtility(IKarlDates) profiles = find_profiles(context) workflow = get_workflow(IBlogEntry, 'security', context) if workflow is None: security_states = [] else: security_states = get_security_states(workflow, context, request) # Convert blog comments into a digestable form for the template comments = [] page_title = context.title api = TemplateAPI(context, request, page_title) for comment in context['comments'].values(): profile = profiles.get(comment.creator) author_name = profile.title author_url = resource_url(profile, request) newc = {} newc['id'] = comment.__name__ if has_permission('edit', comment, request): newc['edit_url'] = resource_url(comment, request, 'edit.html') else: newc['edit_url'] = None if has_permission('delete', comment, request): newc['delete_url'] = resource_url(comment, request, 'delete.html') else: newc['delete_url'] = None if has_permission('administer', comment, request): newc['advanced_url'] = resource_url(comment, request, 'advanced.html') else: newc['advanced_url'] = None # Display portrait photo = profile.get('photo') if photo is not None: photo_url = thumb_url(photo, request, PROFILE_THUMB_SIZE) else: photo_url = api.static_url + "/images/defaultUser.gif" newc["portrait_url"] = photo_url newc['author_url'] = author_url newc['author_name'] = author_name newc['date'] = karldates(comment.created, 'longform') newc['timestamp'] = comment.created newc['text'] = comment.text # Fetch the attachments info newc['attachments'] = fetch_attachments(comment, request) comments.append(newc) comments.sort(key=lambda c: c['timestamp']) client_json_data = dict(tagbox=get_tags_client_data(context, request), ) actions = [] if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('edit', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) api.is_taggable = True byline_info = getMultiAdapter((context, request), IBylineInfo) blog = find_interface(context, IBlog) backto = { 'href': resource_url(blog, request), 'title': blog.title, } # manually construct formish comment form controller = AddCommentFormController(context['comments'], request) form_schema = schemaish.Structure() form_fields = controller.form_fields() for fieldname, field in form_fields: form_schema.add(fieldname, field) form_action_url = '%sadd_comment.html' % resource_url( context['comments'], request) comment_form = Form(form_schema, add_default_action=False, name='save', action_url=form_action_url) form_defaults = controller.form_defaults() comment_form.defaults = form_defaults request.form_defaults = form_defaults form_actions = [ FormAction('submit', 'submit'), FormAction('cancel', 'cancel', validate=False) ] for action in form_actions: comment_form.add_action(action.name, action.title) widgets = controller.form_widgets(form_fields) for name, widget in widgets.items(): comment_form[name].widget = widget # this is for enable imagedrawer for adding blog comments api.karl_client_data['text'] = dict(enable_imagedrawer_upload=True, ) return dict( api=api, actions=actions, comments=comments, attachments=fetch_attachments(context['attachments'], request), head_data=convert_to_script(client_json_data), comment_form=comment_form, post_url=post_url, byline_info=byline_info, backto=backto, security_states=security_states, )
def show_profile_view(context, request): """Show a profile with actions if the current user""" page_title = 'View Profile' api = TemplateAPI(context, request, page_title) # Create display values from model object profile = {} for name in [name for name in context.__dict__.keys() if not name.startswith("_")]: profile_value = getattr(context, name) if profile_value is not None: # Don't produce u'None' profile[name] = unicode(profile_value) else: profile[name] = None if 'fax' not in profile: profile['fax'] = '' # BBB # 'websites' is a property, so the loop above misses it profile["websites"] = context.websites # ditto for 'title' profile["title"] = context.title if profile.has_key("languages"): profile["languages"] = context.languages if profile.has_key("department"): profile["department"] = context.department if profile.get("last_login_time"): stamp = context.last_login_time.strftime('%Y-%m-%dT%H:%M:%SZ') profile["last_login_time"] = stamp if profile.has_key("country"): # translate from country code to country name country_code = profile["country"] country = countries.as_dict.get(country_code, u'') profile["country"] = country # Display portrait photo = context.get('photo') display_photo = {} if photo is not None: display_photo["url"] = thumb_url(photo, request, PROFILE_THUMB_SIZE) else: display_photo["url"] = api.static_url + "/images/defaultUser.gif" profile["photo"] = display_photo # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) # Get communities this user is a member of, along with moderator info # communities = {} communities_folder = find_communities(context) user_info = find_users(context).get_by_id(context.__name__) if user_info is not None: for group in user_info["groups"]: if group.startswith("group.community:"): unused, community_name, role = group.split(":") if (communities.has_key(community_name) and role != "moderators"): continue community = communities_folder.get(community_name, None) if community is None: continue if has_permission('view', community, request): communities[community_name] = { "title": community.title, "moderator": role == "moderators", "url": resource_url(community, request), } communities = communities.values() communities.sort(key=lambda x:x["title"]) preferred_communities = [] my_communities = None name = context.__name__ # is this the current user's profile? if authenticated_userid(request) == name: preferred_communities = get_preferred_communities(communities_folder, request) my_communities = get_my_communities(communities_folder, request) tagger = find_tags(context) if tagger is None: tags = () else: tags = [] names = tagger.getTags(users=[context.__name__]) for name, count in sorted(tagger.getFrequency(names, user=context.__name__), key=lambda x: x[1], reverse=True, )[:10]: tags.append({'name': name, 'count': count}) # List recently added content num, docids, resolver = ICatalogSearch(context)( sort_index='creation_date', reverse=True, interfaces=[IContent], limit=5, creator=context.__name__, allowed={'query': effective_principals(request), 'operator': 'or'}, ) recent_items = [] for docid in docids: item = resolver(docid) if item is None: continue adapted = getMultiAdapter((item, request), IGridEntryInfo) recent_items.append(adapted) return render_to_response( 'templates/profile.pt', dict(api=api, profile=profile, actions=get_profile_actions(context, request), photo=photo, head_data=convert_to_script(client_json_data), communities=communities, my_communities=my_communities, preferred_communities=preferred_communities, tags=tags, recent_items=recent_items), request=request, )
def report_view(context, request, pictures=False): api = TemplateAPI(context, request, context.title) peopledir = find_peopledirectory(context) section = context.__parent__ section_name = section.__name__ while section and not IPeopleSection.providedBy(section): section = section.__parent__ if section: section_name = section.__name__ peopledir_tabs = get_tabs(peopledir, request, section_name) report_data = get_grid_data(context, request) batch = report_data['batch'] if pictures: rows = profile_photo_rows(batch['entries'], request, api) else: rows = None del (report_data['batch']) # non-json serializable client_json_data = {'grid_data': report_data} descriptions = get_report_descriptions(context) mgr = ILetterManager(context) letter_info = mgr.get_info(request) kw, qualifiers = get_search_qualifiers(request) print_url = resource_url(context, request, 'print.html', **kw) csv_url = resource_url(context, request, 'csv', **kw) pictures_url = resource_url(context, request, 'picture_view.html', **kw) tabular_url = resource_url(context, request, **kw) opensearch_url = resource_url(context, request, 'opensearch.xml') mailto = _get_mailto(context, peopledir) actions = [{ 'name': 'print', 'title': 'Print', 'description': 'Print this report', 'bs-icon': 'icon-print', 'url': request.resource_url(context, 'print.html') }, { 'name': 'csv', 'title': 'Export as CSV', 'description': 'Export this report as CSV', 'bs-icon': 'icon-download', 'url': request.resource_url(context, 'csv') }] if mailto: actions.insert( 0, { 'name': 'email', 'title': 'Email', 'bs-icon': 'icon-envelope', 'description': 'Email', 'url': mailto }) if opensearch_url: actions.insert( 0, { 'name': 'opensearch', 'title': 'Opensearch', 'bs-icon': 'icon-search', 'description': 'Add KARL People Search to your browser toolbar', 'url': "javascript:window.external.AddSearchProvider('%s');" % opensearch_url }) return dict( api=api, peopledir=peopledir, peopledir_tabs=peopledir_tabs, context_tools=peopledir_tabs, batch_info=batch, head_data=convert_to_script(client_json_data), rows=rows, descriptions=descriptions, letters=letter_info, print_url=print_url, csv_url=csv_url, pictures_url=pictures_url, tabular_url=tabular_url, qualifiers=qualifiers, opensearch_url=opensearch_url, actions=get_actions(context, request), mailto=mailto, )
def show_forum_topic_view(context, request): post_url = model_url(context, request, "comments", "add_comment.html") karldates = getUtility(IKarlDates) profiles = find_profiles(context) # Convert comments into a digestable form for the template comments = [] page_title = context.title actions = [] if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) api = TemplateAPI(context, request, page_title) for comment in context['comments'].values(): profile = profiles.get(comment.creator) author_name = profile.title author_url = model_url(profile, request) newc = {} newc['id'] = comment.__name__ if has_permission('edit', comment, request): newc['edit_url'] = model_url(comment, request, 'edit.html') newc['delete_url'] = model_url(comment, request, 'delete.html') else: newc['edit_url'] = None newc['delete_url'] = None # Display portrait photo = profile.get_photo() photo_url = {} if photo is not None: photo_url = model_url(photo, request) else: photo_url = api.static_url + "/images/defaultUser.gif" newc["portrait_url"] = photo_url newc['author_url'] = author_url newc['author_name'] = author_name newc['date'] = karldates(comment.created, 'longform') newc['timestamp'] = comment.created newc['text'] = comment.text # Fetch the attachments info newc['attachments'] = fetch_attachments(comment, request) comments.append(newc) comments.sort(key=lambda x: x['timestamp']) byline_info = getMultiAdapter((context, request), IBylineInfo) forum = find_interface(context, IForum) backto = { 'href': model_url(forum, request), 'title': forum.title, } # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('community') if support_attachments(context): attachments = fetch_attachments(context['attachments'], request) else: attachments = () return render_template_to_response( 'templates/show_forum_topic.pt', api=api, actions=actions, comments=comments, attachments=attachments, formfields=api.formfields, post_url=post_url, byline_info=byline_info, head_data=convert_to_script(client_json_data), backto=backto, layout=layout, )
def report_view(context, request, pictures=False): api = TemplateAPI(context, request, context.title) peopledir = find_peopledirectory(context) section = context.__parent__ section_name = section.__name__ while section and not IPeopleSection.providedBy(section): section = section.__parent__ if section: section_name = section.__name__ peopledir_tabs = get_tabs(peopledir, request, section_name) # make the max limit here ridiculously huge so the frontend can just deal # with rendering all of the data. this should scale fairly well up to # quite large datasets (several thousand if not tens of thousands) -- if # it starts becoming an issue, then the limit will need to be reduced, and # the client lib updated to handle the paging interaction with the backend report_data = get_grid_data(context, request, limit=2147483647) batch = report_data['batch'] if pictures: rows = profile_photo_rows(batch['entries'], request, api) else: rows = None del(report_data['batch']) # non-json serializable client_json_data = {'grid_data': report_data} descriptions = get_report_descriptions(context) mgr = ILetterManager(context) letter_info = mgr.get_info(request) kw, qualifiers = get_search_qualifiers(request) print_url = resource_url(context, request, 'print.html', **kw) csv_url = resource_url(context, request, 'csv', **kw) pictures_url = resource_url(context, request, 'picture_view.html', **kw) tabular_url = resource_url(context, request, **kw) opensearch_url = resource_url(context, request, 'opensearch.xml') mailto=_get_mailto(context, peopledir) actions = [ {'name': 'print', 'title': 'Print', 'description': 'Print this report', 'bs-icon': 'icon-print', 'url': request.resource_url(context, 'print.html')}, {'name': 'csv', 'title': 'Export as CSV', 'description': 'Export this report as CSV', 'bs-icon': 'icon-download', 'url': request.resource_url(context, 'csv')}] if mailto: actions.insert(0, { 'name': 'email', 'title': 'Email', 'bs-icon': 'icon-envelope', 'description': 'Email', 'url': mailto}) if opensearch_url: actions.insert(0, { 'name': 'opensearch', 'title': 'Opensearch', 'bs-icon': 'icon-search', 'description': 'Add KARL People Search to your browser toolbar', 'url': "javascript:window.external.AddSearchProvider('%s');" % opensearch_url}) return dict( api=api, peopledir=peopledir, peopledir_tabs=peopledir_tabs, context_tools=peopledir_tabs, batch_info=batch, head_data=convert_to_script(client_json_data), rows=rows, descriptions=descriptions, letters=letter_info, print_url=print_url, csv_url=csv_url, pictures_url=pictures_url, tabular_url=tabular_url, qualifiers=qualifiers, opensearch_url=opensearch_url, actions=get_actions(context, request), mailto=mailto, )
def show_profile_view(context, request): """Show a profile with actions if the current user""" page_title = "Profile: %s" % context.title api = TemplateAPI(context, request, page_title) # Create display values from model object profile = {} for name in [ name for name in context.__dict__.keys() if not name.startswith("_") ]: profile_value = getattr(context, name) if profile_value is not None: # Don't produce u'None' profile[name] = unicode(profile_value) else: profile[name] = None if 'fax' not in profile: profile['fax'] = '' # BBB # 'websites' is a property, so the loop above misses it profile["websites"] = context.websites # ditto for 'title' profile["title"] = context.title if profile.has_key("languages"): profile["languages"] = context.languages if profile.has_key("department"): profile["department"] = context.department if profile.get("last_login_time"): stamp = context.last_login_time.strftime('%Y-%m-%dT%H:%M:%SZ') profile["last_login_time"] = stamp if profile.has_key("country"): # translate from country code to country name country_code = profile["country"] country = countries.as_dict.get(country_code, u'') profile["country"] = country # Display portrait photo = context.get('photo') display_photo = {} if photo is not None: display_photo["url"] = thumb_url(photo, request, PROFILE_THUMB_SIZE) else: display_photo["url"] = api.static_url + "/images/defaultUser.gif" profile["photo"] = display_photo # provide client data for rendering current tags in the tagbox client_json_data = dict(tagbox=get_tags_client_data(context, request), ) # Get communities this user is a member of, along with moderator info # communities = {} communities_folder = find_communities(context) user_info = find_users(context).get_by_id(context.__name__) if user_info is not None: for group in user_info["groups"]: if group.startswith("group.community:"): unused, community_name, role = group.split(":") if (communities.has_key(community_name) and role != "moderators"): continue community = communities_folder.get(community_name, None) if community is None: continue if has_permission('view', community, request): communities[community_name] = { "title": community.title, "moderator": role == "moderators", "url": resource_url(community, request), } communities = communities.values() communities.sort(key=lambda x: x["title"]) preferred_communities = [] my_communities = None name = context.__name__ # is this the current user's profile? if authenticated_userid(request) == name: preferred_communities = get_preferred_communities( communities_folder, request) my_communities = get_my_communities(communities_folder, request) tagger = find_tags(context) if tagger is None: tags = () else: tags = [] names = tagger.getTags(users=[context.__name__]) for name, count in sorted( tagger.getFrequency(names, user=context.__name__), key=lambda x: x[1], reverse=True, )[:10]: tags.append({'name': name, 'count': count}) # List recently added content num, docids, resolver = ICatalogSearch(context)( sort_index='creation_date', reverse=True, interfaces=[IContent], limit=5, creator=context.__name__, allowed={ 'query': effective_principals(request), 'operator': 'or' }, ) recent_items = [] for docid in docids: item = resolver(docid) if item is None: continue adapted = getMultiAdapter((item, request), IGridEntryInfo) recent_items.append(adapted) recent_url = request.resource_url(context, 'recent_content.html') return dict(api=api, profile=profile, actions=get_profile_actions(context, request), photo=photo, head_data=convert_to_script(client_json_data), communities=communities, my_communities=my_communities, preferred_communities=preferred_communities, tags=tags, recent_items=recent_items, recent_url=recent_url)
api = TemplateAPI(context, request, page_title) # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('intranet') return render_form_to_response( 'templates/addedit_referencemanual.pt', form, fill_values, post_url=request.url, formfields=api.formfields, fielderrors=fielderrors, api=api, head_data=convert_to_script(dict( tags_field = tags_field, )), layout=layout, ) def _get_toc(context, here_url): """Get the nested data used by ZPT for showing the refman TOC""" section_up = here_url + '?sectionUp=%s' section_down = here_url + '?sectionDown=%s' item_up = here_url + '?section=%s&itemUp=%s' item_down = here_url + '?section=%s&itemDown=%s' # First, be a chicken and sync context.ordering.sync(context.keys()) # Iterate over each section using the ordering for the order of
def show_folder_view(context, request): page_title = context.title api = TemplateAPI(context, request, page_title) # Now get the data that goes with this # Actions backto = False actions = [] if has_permission('create', context, request): # Allow "policy" to override list of addables in a particular context addables = get_folder_addables(context, request) if addables is not None: actions.extend(addables()) if not (ICommunityRootFolder.providedBy(context) or IIntranetRootFolder.providedBy(context)): # Root folders for the tools aren't editable or deletable if has_permission('create', context, request): actions.append(('Edit', 'edit.html')) actions.append(('Delete', 'delete.html')) in_intranets = find_interface(context, IIntranets) is not None if has_permission('administer', context, request) and in_intranets: # admins see an Advanced action that puts markers on a # folder. actions.append( ('Advanced','advanced.html'), ) backto = { 'href': model_url(context.__parent__, request), 'title': context.__parent__.title, } # Only provide atom feed links on root folder. if ICommunityRootFolder.providedBy(context): feed_url = model_url(context, request, "atom.xml") else: feed_url = None # Folder and tag data for Ajax client_json_data = dict( filegrid = get_filegrid_client_data(context, request, start = 0, limit = 10, sort_on = 'modified_date', reverse = True, ), tagbox = get_tags_client_data(context, request), ) # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('community') return render_template_to_response( 'templates/show_folder.pt', api=api, actions=actions, head_data=convert_to_script(client_json_data), backto=backto, layout=layout, feed_url=feed_url, )
def show_referencemanual_view(context, request): # Look for moveUp or moveDown in QUERY_STRING, telling us to # reorder something status_message = None sectionUp = request.params.get('sectionUp', False) if sectionUp: section = context.get(sectionUp) context.ordering.moveUp(sectionUp) status_message = 'Moved section <em>%s</em> up' % section.title else: sectionDown = request.params.get('sectionDown', False) if sectionDown: section = context.get(sectionDown) context.ordering.moveDown(sectionDown) status_message = 'Moved section <em>%s</em> down' % section.title else: itemUp = request.params.get('itemUp', False) if itemUp: section = context.get(request.params.get('section')) section.ordering.moveUp(itemUp) title = section.get(itemUp).title status_message = 'Moved item <em>%s</em> up' % title else: itemDown = request.params.get('itemDown', False) if itemDown: section = context.get(request.params.get('section')) section.ordering.moveDown(itemDown) title = section.get(itemDown).title status_message = 'Moved item <em>%s</em> down' % title backto = { 'href': model_url(context.__parent__, request), 'title': context.__parent__.title, } actions = [] if has_permission('create', context, request): addables = get_folder_addables(context, request) if addables is not None: actions.extend(addables()) actions.append(('Edit', 'edit.html')) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) page_title = context.title api = TemplateAPI(context, request, page_title) # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('intranet') # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) api.status_message = status_message return render_template_to_response( 'templates/show_referencemanual.pt', api=api, actions=actions, head_data=convert_to_script(client_json_data), sections=_get_toc(context, api.here_url), backto=backto, layout=layout, )
def show_calendarevent_view(context, request): page_title = context.title actions = [] if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) api = TemplateAPI(context, request, page_title) container = context.__parent__ backto = { 'href': model_url(container, request), 'title': container.title, } # Flatten the data into ZPT-friendly info karldates = getUtility(IKarlDates) title = context.title startDate = karldates(context.startDate, 'longform') endDate = karldates(context.endDate, 'longform') attendees = None if context.attendees: attendees = '; '.join(context.attendees) location = context.location contact_name = context.contact_name contact_email = context.contact_email # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('community') # find this event's calendar category title calendar = find_interface(context, ICalendar) if calendar is not None: titles = {} for cat in _get_calendar_categories(calendar): titles[model_path(cat)] = cat.title category_title = titles.get(context.calendar_category) else: category_title = None return render_template_to_response( 'templates/show_calendarevent.pt', api=api, actions=actions, head_data=convert_to_script(dict( tagbox = get_tags_client_data(context, request), )), title=title, startDate=startDate, endDate=endDate, attendees=attendees, location=location, contact_name=contact_name, contact_email=contact_email, category_title=category_title, attachments=fetch_attachments(context['attachments'], request), backto=backto, layout=layout, )
class CustomFolderView(object): _past_events = None past_events_url = None future_events_url = None def __init__(self, context, request): self.context = context self.request = request searchterm = request.params.get('searchterm', None) if searchterm == '': searchterm = None self.searchterm = searchterm year = request.params.get('year', None) if year == 'all': year = None self.year = year month = request.params.get('month', None) if month == 'all': month = None self.month = month def __call__(self): """ Folder contents for the INetworkEvents marker""" context = self.context request = self.request page_title = context.title api = TemplateAPI(context, request, page_title) # Data for the filter bar, get the list of possible years and months this_year = datetime.datetime.now().year fb_years = [str(i) for i in range(2007, this_year+1)] fb_months = [('1', 'January'), ('2', 'February'), ('3', 'March'), ('4', 'April'), ('5', 'May'), ('6', 'June'), ('7', 'July'), ('8', 'August'), ('9', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')] # Flatten the search results into ZPT data try: batch = self._get_batch() except ParseError, e: api.set_error_message('Error: %s' % e) batch = {'entries': (), 'batching_required': False} entries = [] for entry in batch["entries"]: info = {} info['url'] = resource_url(entry, request) info['title'] = entry.title info['date'] = self._get_date(entry) entries.append(info) # Actions and backlink actions = [] if has_permission('create', context, request): addables = get_folder_addables(context, request) if addables is not None: actions.extend(addables()) if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('delete', context.__parent__, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): # admins see an Advanced action that puts markers on a folder. actions.append(('Advanced', 'advanced.html')) back_target, extra_path = get_user_home(context, request) backto = { 'href': resource_url(back_target, request, *extra_path), 'title': getattr(back_target, "title", "Home") } client_json_data = dict( tagbox = get_tags_client_data(context, request), ) # Get a layout layout_provider = get_layout_provider(context, request) layout = layout_provider('community') intranet = find_intranet(self.context) intranets = find_intranets(self.context) community = find_community(self.context) if intranet is not None or community == intranets: ux2_layout = self.request.layout_manager.layout ux2_layout.section_style = "none" return dict( api=api, actions=actions, head_data=convert_to_script(client_json_data), backto=backto, old_layout=layout, entries=entries, fb_years=fb_years, fb_months=fb_months, searchterm=self.searchterm, selected_year=self.year, selected_month=self.month, batch_info=batch, past_events_url=self.past_events_url, future_events_url=self.future_events_url, )
def show_blogentry_view(context, request): post_url = resource_url(context, request, "comments", "add_comment.html") karldates = getUtility(IKarlDates) profiles = find_profiles(context) workflow = get_workflow(IBlogEntry, 'security', context) if workflow is None: security_states = [] else: security_states = get_security_states(workflow, context, request) # Convert blog comments into a digestable form for the template comments = [] page_title = context.title api = TemplateAPI(context, request, page_title) for comment in context['comments'].values(): profile = profiles.get(comment.creator) author_name = profile.title author_url = resource_url(profile, request) newc = {} newc['id'] = comment.__name__ if has_permission('edit', comment, request): newc['edit_url'] = resource_url(comment, request, 'edit.html') else: newc['edit_url'] = None if has_permission('delete', comment, request): newc['delete_url'] = resource_url(comment, request, 'delete.html') else: newc['delete_url'] = None if has_permission('administer', comment, request): newc['advanced_url'] = resource_url(comment, request, 'advanced.html') else: newc['advanced_url'] = None # Display portrait photo = profile.get('photo') if photo is not None: photo_url = thumb_url(photo, request, PROFILE_THUMB_SIZE) else: photo_url = api.static_url + "/images/defaultUser.gif" newc["portrait_url"] = photo_url newc['author_url'] = author_url newc['author_name'] = author_name newc['date'] = karldates(comment.created, 'longform') newc['timestamp'] = comment.created newc['text'] = comment.text # Fetch the attachments info newc['attachments'] = fetch_attachments(comment, request) comments.append(newc) comments.sort(key=lambda c: c['timestamp']) client_json_data = dict( tagbox = get_tags_client_data(context, request), ) actions = [] if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('edit', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) api.is_taggable = True byline_info = getMultiAdapter((context, request), IBylineInfo) blog = find_interface(context, IBlog) backto = { 'href': resource_url(blog, request), 'title': blog.title, } # manually construct formish comment form controller = AddCommentFormController(context['comments'], request) form_schema = schemaish.Structure() form_fields = controller.form_fields() for fieldname, field in form_fields: form_schema.add(fieldname, field) form_action_url = '%sadd_comment.html' % resource_url(context['comments'], request) comment_form = Form(form_schema, add_default_action=False, name='save', action_url=form_action_url) form_defaults = controller.form_defaults() comment_form.defaults = form_defaults request.form_defaults = form_defaults form_actions = [FormAction('submit', 'submit'), FormAction('cancel', 'cancel', validate=False)] for action in form_actions: comment_form.add_action(action.name, action.title) widgets = controller.form_widgets(form_fields) for name, widget in widgets.items(): comment_form[name].widget = widget # this is for enable imagedrawer for adding blog comments api.karl_client_data['text'] = dict( enable_imagedrawer_upload = True, ) return dict( api=api, actions=actions, comments=comments, attachments=fetch_attachments( context['attachments'], request), head_data=convert_to_script(client_json_data), comment_form=comment_form, post_url=post_url, byline_info=byline_info, backto=backto, security_states = security_states, )
def show_forum_topic_view(context, request): post_url = resource_url(context, request, "comments", "add_comment.html") karldates = getUtility(IKarlDates) profiles = find_profiles(context) # Convert comments into a digestable form for the template comments = [] page_title = context.title actions = [] if has_permission('edit', context, request): actions.append(('Edit', 'edit.html')) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) api = TemplateAPI(context, request, page_title) for comment in context['comments'].values(): profile = profiles.get(comment.creator) author_name = profile.title author_url = resource_url(profile, request) newc = {} newc['id'] = comment.__name__ if has_permission('edit', comment, request): newc['edit_url'] = resource_url(comment, request, 'edit.html') else: newc['edit_url'] = None if has_permission('delete', comment, request): newc['delete_url'] = resource_url(comment, request, 'delete.html') else: newc['delete_url'] = None if has_permission('administer', comment, request): newc['advanced_url'] = resource_url(comment, request, 'advanced.html') else: newc['advanced_url'] = None # Display portrait photo = profile.get('photo') photo_url = {} if photo is not None: photo_url = thumb_url(photo, request, PROFILE_THUMB_SIZE) else: photo_url = api.static_url + "/images/defaultUser.gif" newc["portrait_url"] = photo_url newc['author_url'] = author_url newc['author_name'] = author_name newc['date'] = karldates(comment.created, 'longform') newc['timestamp'] = comment.created newc['text'] = comment.text # Fetch the attachments info newc['attachments'] = fetch_attachments(comment, request) comments.append(newc) comments.sort(key=lambda x: x['timestamp']) byline_info = getMultiAdapter((context, request), IBylineInfo) forum = find_interface(context, IForum) backto = { 'href': resource_url(forum, request), 'title': forum.title, } # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) # Get a layout layout_provider = get_layout_provider(context, request) old_layout = layout_provider('community') if support_attachments(context): attachments = fetch_attachments(context['attachments'], request) else: attachments = () # manually construct formish comment form controller = AddCommentFormController(context['comments'], request) form_schema = schemaish.Structure() form_fields = controller.form_fields() for fieldname, field in form_fields: form_schema.add(fieldname, field) form_action_url = '%sadd_comment.html' % resource_url(context['comments'], request) comment_form = Form(form_schema, add_default_action=False, name='save', action_url=form_action_url) form_defaults = controller.form_defaults() comment_form.defaults = form_defaults request.form_defaults = form_defaults form_actions = [FormAction('submit', 'submit'), FormAction('cancel', 'cancel', validate=False)] for action in form_actions: comment_form.add_action(action.name, action.title) widgets = controller.form_widgets(form_fields) for name, widget in widgets.items(): comment_form[name].widget = widget # enable imagedrawer for adding forum replies (comments) api.karl_client_data['text'] = dict( enable_imagedrawer_upload = True, ) # ux2 layout = request.layout_manager.layout layout.section_style = "none" layout.head_data['panel_data']['tinymce'] = api.karl_client_data['text'] layout.head_data['panel_data']['tagbox'] = client_json_data['tagbox'] layout.add_portlet('tagbox') return render_to_response( 'templates/show_forum_topic.pt', dict(api=api, actions=actions, comments=comments, attachments=attachments, formfields=api.formfields, post_url=post_url, byline_info=byline_info, head_data=convert_to_script(client_json_data), backto=backto, old_layout=old_layout, comment_form=comment_form), request=request, )
def report_view(context, request, pictures=False): api = TemplateAPI(context, request, context.title) peopledir = find_peopledirectory(context) section = context.__parent__ section_name = section.__name__ while section and not IPeopleSection.providedBy(section): section = section.__parent__ if section: section_name = section.__name__ peopledir_tabs = get_tabs(peopledir, request, section_name) report_data = get_grid_data(context, request) # ux2 slickgrid only widgets = { 'peoplegrid': report_data['slickgrid_info']['widget_options'], #{ ##'loadData': [], ## search_folder(context, request, ##from_=0, ##to=_pre_fetch, ##sort_col='modified', ##sort_dir=-1, # XXX hint from ux1 ##_raw_get_container_batch=_raw_get_container_batch, #), ##'url': resource_url(context, request, 'peoplegrid.json'), #}, } batch = report_data['batch'] if pictures: rows = profile_photo_rows(batch['entries'], request, api) else: rows = None del(report_data['batch']) # non-json serializable client_json_data = {'grid_data': report_data} descriptions = get_report_descriptions(context) mgr = ILetterManager(context) letter_info = mgr.get_info(request) kw, qualifiers = get_search_qualifiers(request) print_url = resource_url(context, request, 'print.html', **kw) csv_url = resource_url(context, request, 'csv', **kw) pictures_url = resource_url(context, request, 'picture_view.html', **kw) tabular_url = resource_url(context, request, **kw) opensearch_url = resource_url(context, request, 'opensearch.xml') mailto=_get_mailto(context, peopledir) formats = [ # ux2 {'name': 'tabular', 'selected': not pictures, 'bs-icon': 'icon-th-list', 'url': tabular_url, 'title': 'Tabular View', 'description': 'Show table'}, {'name': 'picture', 'selected': pictures, 'bs-icon': 'icon-th', 'url': pictures_url, 'title': 'Picture View', 'description': 'Show pictures'} ] actions = [ {'name': 'print', 'title': 'Print', 'description': 'Print this report', 'bs-icon': 'icon-print', 'url': request.resource_url(context, 'print.html')}, {'name': 'csv', 'title': 'Export as CSV', 'description': 'Export this report as CSV', 'bs-icon': 'icon-download', 'url': request.resource_url(context, 'csv')}] if mailto: actions.insert(0, { 'name': 'email', 'title': 'Email', 'bs-icon': 'icon-envelope', 'description': 'Email', 'url': mailto}) if opensearch_url: actions.insert(0, { 'name': 'opensearch', 'title': 'Opensearch', 'bs-icon': 'icon-search', 'description': 'Add KARL People Search to your browser toolbar', 'url': "javascript:window.external.AddSearchProvider('%s');" % opensearch_url}) return dict( api=api, # deprecated in ux2 peopledir=peopledir, # deprecated in ux2 peopledir_tabs=peopledir_tabs, # deprecated in ux2 context_tools=peopledir_tabs, head_data=convert_to_script(client_json_data), # deprecated in ux2 report_data=report_data, # ux2 batch_info=batch, # deprecated in ux2 batch=batch, # ux2 rows=rows, descriptions=descriptions, letters=letter_info, formats=formats, # ux2 report_actions=actions, # ux2 print_url=print_url, # deprecated in ux2 csv_url=csv_url, # deprecated in ux2 pictures_url=pictures_url, # deprecated in ux2 tabular_url=tabular_url, # deprecated in ux2 qualifiers=qualifiers, # deprecated in ux2 opensearch_url=opensearch_url, # deprecated in ux2 actions=get_actions(context, request), mailto=mailto, # deprecated in ux2 widgets=widgets, # ux2 with karlgrid (slickgrid) )
def reference_outline_view(context, request): # Look for moveUp or moveDown in QUERY_STRING, telling us to # reorder something status_message = None subpath = request.params.get('subpath') backto = { 'href': resource_url(context.__parent__, request), 'title': context.__parent__.title, } user_can_edit = False actions = [] if has_permission('create', context, request): addables = get_folder_addables(context, request) if addables is not None: actions.extend(addables()) if has_permission('edit', context, request): user_can_edit = True actions.append(('Edit', 'edit.html')) if subpath: direction = request.params['direction'] status_message = move_subpath(context, subpath, direction) if has_permission('delete', context, request): actions.append(('Delete', 'delete.html')) if has_permission('administer', context, request): actions.append(('Advanced', 'advanced.html')) page_title = context.title api = TemplateAPI(context, request, page_title) # Get a layout layout_provider = get_layout_provider(context, request) old_layout = layout_provider('intranet') # provide client data for rendering current tags in the tagbox client_json_data = dict( tagbox = get_tags_client_data(context, request), ) previous, next = get_previous_next(context, request) intranet = find_intranet(context) if intranet is not None: ux2_layout = request.layout_manager.layout ux2_layout.section_style = "none" api.status_message = status_message return render_to_response( 'templates/show_referencemanual.pt', dict(api=api, actions=actions, user_can_edit=user_can_edit, head_data=convert_to_script(client_json_data), tree=getTree(context, request, api), backto=backto, old_layout=old_layout, previous_entry=previous, next_entry=next), request=request, )