def handle_submit(self, converted): try: context = self.context request = self.request key = request.params.get('key') if not key or len(key) != 40: e = ResetFailed() e.page_title = 'Password Reset URL Problem' raise e users = find_users(context) user = users.get_by_login(converted['login']) if user is None: raise ValidationError(login='******') userid = user.get('id') if userid is None: userid = user['login'] profiles = find_profiles(context) profile = profiles.get(userid) if profile is None: raise ValidationError(login='******') if key != getattr(profile, 'password_reset_key', None): e = ResetFailed() e.page_title = 'Password Reset Confirmation Problem' raise e now = datetime.datetime.now() t = getattr(profile, 'password_reset_time', None) if t is None or now - t > max_reset_timedelta: e = ResetFailed() e.page_title = 'Password Reset Confirmation Key Expired' raise e # The key matched. Clear the key and reset the password. profile.password_reset_key = None profile.password_reset_time = None password = converted['password'].encode('UTF-8') users.change_password(userid, password) request.session['password_expired'] = False profile.password_expiration_date = (datetime.datetime.utcnow() + datetime.timedelta(days=180)) max_retries = request.registry.settings.get('max_login_retries', 8) context.login_tries[converted['login']] = max_retries page_title = 'Password Reset Complete' api = TemplateAPI(context, request, page_title) return render_to_response( 'templates/reset_complete.pt', dict(api=api, login=converted['login'], password=converted['password']), request=request, ) except ResetFailed, e: api = TemplateAPI(context, request, e.page_title) return render_to_response('templates/reset_failed.pt', dict(api=api), request=request)
def __call__(self): key = self.request.params.get('key') if not key or len(key) != 40: api = TemplateAPI(self.context, self.request, 'Password Reset URL Problem') return render_to_response('templates/reset_failed.pt', dict(api=api), request=self.request) snippets = get_renderer('forms/templates/snippets.pt').implementation() snippets.doctype = xhtml blurb_macro = snippets.macros['reset_confirm_blurb'] api = TemplateAPI(self.context, self.request, u'Reset Password') return {'api': api, 'blurb_macro': blurb_macro}
def stats(context, request): """ This appears to no longer be in use. If we can't confirm someone is using it after some period of time we shoudl probably get rid of it. --rossi 5/5/2011 """ me = sys.argv[0] me = os.path.abspath(me) sandbox = os.path.dirname(os.path.dirname(me)) outfile_path = os.path.join(sandbox, 'var/stats/', 'stats.csv') if not os.path.exists(outfile_path): raise NotFound f = open(outfile_path, 'r') lines = f.readlines() resp_out = "" line_arrays = [] for line in lines: resp_out = resp_out + line + "<br/>" line2 = line myarr = line2.split(",") line_arrays.append(myarr) page_title = 'Admin Statistics' api = TemplateAPI(context, request, page_title) return render_to_response( 'templates/stats.pt', dict(api=api, stats=resp_out, comms=line_arrays), request=request, )
def __call__(self): layout_provider = get_layout_provider(self.context, self.request) layout = layout_provider('community') page_title = 'Edit %s' % self.context.title api = TemplateAPI(self.context, self.request, page_title) api.karl_client_data['text'] = dict(enable_imagedrawer_upload=True, ) return {'api': api, 'layout': layout, 'actions': []}
def month_users_view(context, request): year = context.__parent__.__name__ month = context.__name__ api = TemplateAPI(context, request, '%s - %s user metrics' % (year, month)) layout_provider = get_layout_provider(context, request) layout = layout_provider() if 'csv' in request.GET: def generate_csv_row(row): return [ row['total'], row['staff'], row['core_office'], row['national_foundation'], row['former'], row['affiliate'], row['active'], ] return csv_response(request, '%s-%s-users.csv' % (year, month), [ 'Total', 'Staff', 'Core Office', 'National Foundation', 'Former Staff', 'Affiliate', 'Active' ], [context.users['total']], generate_csv_row) return dict(api=api, layout=layout, metricsmacros=_metrics_macros(), userdata=context.users['total'], backto=backto_year(context, request))
def month_profiles_view(context, request): year = context.__parent__.__name__ month = context.__name__ api = TemplateAPI(context, request, '%s - %s profile metrics' % (year, month)) layout_provider = get_layout_provider(context, request) layout = layout_provider() profiles = [ dict(name=k, created=v['created'], is_staff=v['is_staff']) for k, v in context.profiles.items() ] profiles.sort(key=lambda x: x['name']) if 'csv' in request.GET: def generate_csv_row(profile): return [ profile['name'].title(), profile['is_staff'], profile['created'], ] return csv_response(request, '%s-%s-profiles.csv' % (year, month), ['User', 'Staff', 'Created'], profiles, generate_csv_row) return dict(api=api, layout=layout, metricsmacros=_metrics_macros(), profiles=profiles, backto=backto_year(context, request))
def month_contenttype_view(context, request): year = context.__parent__.__name__ month = context.__name__ api = TemplateAPI(context, request, '%s - %s contenttype metrics' % (year, month)) layout_provider = get_layout_provider(context, request) layout = layout_provider() contenttypes = [ dict(name=k, total=v['total'], created=v['created']) for k, v in context.contenttypes.items() ] contenttypes.sort(key=lambda x: x['name']) if 'csv' in request.GET: def generate_csv_row(contenttype): return [ contenttype['name'].title(), contenttype['created'], contenttype['total'], ] return csv_response(request, '%s-%s-contenttype.csv' % (year, month), ['Content Type', 'Created', 'Total'], contenttypes, generate_csv_row) return dict(api=api, layout=layout, metricsmacros=_metrics_macros(), contenttypes=contenttypes, backto=backto_year(context, request))
def all_forums_view(context, request): page_title = "Message Boards" api = TemplateAPI(context, request, page_title) # Don't use the forums folder as the starting point, use its # parent (the community) to allow recursion context_path = model_path(context.__parent__) searcher = ICatalogSearch(context) total, docids, resolver = searcher( interfaces=[ICommunity], path={'query': context_path, 'include_path': True}, allowed={'query': effective_principals(request), 'operator': 'or'}, sort_index='title', ) community_data = [] for docid in docids: community = resolver(docid) if community is not None: forum_data = get_forum_data(community, request) if forum_data: community_data.append({'title': community.title, 'forum_data': forum_data}) return render_to_response( 'templates/all_forums.pt', {'api': api, 'community_data': community_data}, request=request )
def __call__(self): api = TemplateAPI(self.context, self.request, 'Add Wiki Page') api.karl_client_data['text'] = dict( enable_wiki_plugin=True, enable_imagedrawer_upload=True, ) return {'api': api, 'actions': ()}
def delete_resource_view(context, request, num_children=0): page_title = 'Delete ' + context.title api = TemplateAPI(context, request, page_title) confirm = request.params.get('confirm') if confirm: location = resource_url(context.__parent__, request, query=dict(status_message='Deleted %s' % context.title)) del context.__parent__[context.__name__] return HTTPFound(location=location) # Get a layout layout_provider = get_layout_provider(context, request) layout_name = 'generic' if find_intranet(context): layout_name = 'intranet' elif find_community(context): layout_name = 'community' layout = layout_provider(layout_name) return { 'api': api, # deprecated UX2 'old_layout': layout, # deprecated UX2 'num_children': num_children, }
def form_widgets(self, fields): page_title = self.request.layout_manager.layout.page_title api = TemplateAPI(self.context, self.request, page_title) default_icon = '%s/images/defaultUser.gif' % api.static_url show_remove_checkbox = self.photo is not None widgets = {'firstname': formish.Input(empty=''), 'lastname': formish.Input(empty=''), 'email': formish.Input(), 'phone': formish.Input(empty=''), 'extension': formish.Input(empty=''), 'fax': formish.Input(empty=''), 'department': formish.Input(empty=''), 'position': formish.Input(empty=''), 'organization': formish.Input(empty=''), 'location': formish.Input(empty=''), 'country': formish.SelectChoice(options=countries), 'websites': formish.TextArea( rows=3, converter_options={'delimiter':'\n'}), 'languages': formish.Input(empty=''), 'photo': karlwidgets.PhotoImageWidget( filestore=self.filestore, url_base=resource_url(self.context, self.request), image_thumbnail_default=default_icon, show_remove_checkbox=show_remove_checkbox), 'biography': karlwidgets.RichTextWidget(empty=''), 'date_format': karlwidgets.VerticalRadioChoice( options=cultures, none_option=None), } return widgets
def following_search(context, request): """ View the list of users returned by a search """ layout = request.layout_manager.layout if layout is not None: userid = authenticated_userid(request) other_user = getattr(request, 'chatter_user_id', userid) layout.add_portlet( 'chatter.follow_info', _quippers_from_users(context, request, [other_user])) layout.add_portlet('chatter.user_search') chatter = find_chatter(context) chatter_url = resource_url(chatter, request) layout = request.layout_manager.layout profiles = search_profiles_json(context, request) if len(profiles) == 1: location = '%s%s' % (chatter_url, profiles[0]['value']) return HTTPFound(location=location) profiles = [profile['value'] for profile in profiles] to_follow = {'members': _quippers_from_users(context, request, profiles)} return { 'api': TemplateAPI(context, request, 'Search users for following'), 'members': to_follow, 'context_tools': get_context_tools(request, selected='following'), 'chatter_url': chatter_url, 'page_title': 'Chatter: Search users for following' }
def tag_chatter(context, request): """ HTML wrapper for 'tag_chatter_json'. """ userid = authenticated_userid(request) chatter = find_chatter(context) followed_tags = sorted(chatter.listFollowedTags(userid)) tag_list = chatter.recentTags() tag = request.GET.get('tag', None) if tag is not None: info = tag_chatter_json(context, request) subtitle = "Posts that mention %s" % tag else: info = followed_tag_chatter_json(context, request) subtitle = "Followed topics" info['api'] = TemplateAPI(context, request, 'Chatter: #%s' % tag) chatter_url = resource_url(find_chatter(context), request) info['chatter_url'] = chatter_url info['chatter_form_url'] = '%sadd_chatter.html' % chatter_url info['context_tools'] = get_context_tools(request, selected='topics') info['page_title'] = 'Chatter: Topics' info['subtitle'] = subtitle info['followed_tags'] = followed_tags info['tag'] = tag layout = request.layout_manager.layout if layout is not None: layout.add_portlet('chatter.tag_search') layout.add_portlet('chatter.tag_info', followed_tags, tag_list, tag) return info
def followed_by(context, request): """ View the list of users following the current user. """ layout = request.layout_manager.layout if layout is not None: userid = authenticated_userid(request) other_user = getattr(request, 'chatter_user_id', userid) layout.add_portlet( 'chatter.follow_info', _quippers_from_users(context, request, [other_user])) layout.add_portlet('chatter.user_search') chatter = find_chatter(context) chatter_url = resource_url(chatter, request) layout = request.layout_manager.layout followed_by = followed_by_json(context, request) return { 'api': TemplateAPI(context, request, 'Following: %s' % followed_by['userid']), 'followed_by': followed_by, 'context_tools': get_context_tools(request, selected='followers'), 'chatter_url': chatter_url, }
def forbidden(context, request): site = find_site(context) request.session['came_from'] = request.url api = TemplateAPI(context, request, 'Forbidden') request.response.status = '200 OK' blacklisted = request.session.get('access_blacklisted', False) if blacklisted: notice = getattr(site, 'restricted_notice', '') return render_to_response('templates/forbidden_blacklisted.pt', dict(api=api, notice=notice), request=request) password_expired = request.session.get('password_expired', False) if password_expired: redirect = request.session.get('change_url') return HTTPFound(location=redirect) if api.userid: login_url = resource_url(site, request, 'login.html') else: reason = request.session.get('logout_reason') if reason is None: reason = 'Not logged in' login_url = resource_url(site, request, 'login.html', query={'reason': reason}) return { 'api': api, 'login_form_url': login_url, 'homepage_url': resource_url(site, request) }
def messages(context, request): layout = request.layout_manager.layout info = {} userid = '' info['latest_messages_users'] = latest_messages_users_json( context, request) ## temporary for laying out, will be an ajax call from the frontend info['user_messages'] = [] info['correspondent'] = None if info['latest_messages_users']: userid = info['latest_messages_users'][0]['userid'] user_messages = user_messages_json(context, request, userid) info['user_messages'] = user_messages['data'] info['correspondent'] = user_messages['correspondent'] ## info['api'] = TemplateAPI(context, request, 'Messages') chatter_url = resource_url(find_chatter(context), request) info['chatter_url'] = chatter_url info['chatter_form_url'] = '%sadd_chatter.html' % chatter_url info['context_tools'] = get_context_tools(request, selected='messages') info['page_title'] = 'Chatter: Messages' info['recipient'] = userid current_userid = authenticated_userid(request) profiles = find_profiles(request.context) profile = profiles.get(current_userid) if profile is not None: profile.last_chatter_query = datetime.datetime.utcnow() return info
def __call__(self): community = self.community context = self.context request = self.request profiles = self.profiles layout = request.layout_manager.layout # Handle userid passed in via GET request # Moderator would get here by clicking a link in an email to grant a # user's request to join this community. add_user_id = request.params.get("user_id", None) if add_user_id is not None: profile = profiles.get(add_user_id, None) if profile is not None: return _add_existing_users(context, community, [ profile, ], "", request) system_name = get_setting(context, 'system_name', 'KARL') layout.page_title = u'Add Existing %s Users' % system_name api = TemplateAPI(context, request, layout.page_title) actions = _get_manage_actions(community, request) actions_menu = _get_actions_menu(context, request, actions) desc = ('Type the first few letters of the name of the person you ' 'would like to add to this community, select their name, ' 'and press submit. The short message below is included ' 'along with the text of your invite.') return { 'api': api, # deprecated in ux2 'actions': actions, # deprecated in ux2 'page_title': layout.page_title, # deprecated in ux2 'actions_menu': actions_menu, 'page_description': desc }
def retail_view(context, request): page_title = context.title api = TemplateAPI(context, request, page_title) middle_portlet_html = _get_portlet_html(context, request, context.middle_portlets) right_portlet_html = _get_portlet_html(context, request, context.right_portlets) current_intranet = api.current_intranet feature = getattr(find_intranets(current_intranet), 'feature', u'') # Rendering this separately gives us a chance later to think about # some kind of caching. body = render('templates/intranethome_body.pt', dict(current_intranet=current_intranet, feature=feature, middle_portlet_html=middle_portlet_html, right_portlet_html=right_portlet_html), request=request) return render_to_response( 'templates/intranet_homepage.pt', dict(api=api, body=body), request=request, )
def show_profiles_view(context, request): system_name = get_setting(context, 'system_name', 'KARL') page_title = '%s Profiles' % system_name api = TemplateAPI(context, request, page_title) # Grab the data for the two listings, main communities and portlet search = ICatalogSearch(context) query = dict(sort_index='title', interfaces=[IProfile], limit=5) titlestartswith = request.params.get('titlestartswith') if titlestartswith: query['titlestartswith'] = (titlestartswith, titlestartswith) num, docids, resolver = search(**query) profiles = [] for docid in docids: model = resolver(docid) if model is None: continue profiles.append(model) mgr = ILetterManager(context) letter_info = mgr.get_info(request) return render_to_response( 'templates/profiles.pt', dict(api=api, profiles=profiles, letters=letter_info), request=request, )
def announcements_view(context, request): page_title = 'Site Announcements' api = TemplateAPI(context, request, page_title) userid = authenticated_userid(request) if userid is None: raise Exception("User must be logged in") site = api.site profiles = find_profiles(site) profile = profiles.get(userid, None) if profile is None: raise Exception("User must have a profile") seen = Set() if hasattr(profile, "_seen_announcements"): for item in profile._seen_announcements: seen.add(item) if hasattr(site, 'site_announcements'): newseen = seen.copy() for annc in site.site_announcements: newseen.add(annc['hash']) profile._seen_announcements = PersistentList(list(newseen)) return dict(api=api, seen=list(seen))
def __call__(self): tapi = TemplateAPI(self.context, self.request, 'Trash') if self.error is None: self.fill_deleted() else: tapi.set_status_message(unicode(self.error)) return {'api': tapi, 'deleted': self.deleted}
def opensearch_view(context, request): api = TemplateAPI(context, request, 'KARL People OpenSearch') return dict( api=api, report=context, url=resource_url(context, request), )
def section_view(context, request): subs = [ sub for sub in context.values() if has_permission('view', sub, request) and IPeopleReport.providedBy(sub) ] if len(subs) == 1: return HTTPFound(location=resource_url(subs[0], request)) api = TemplateAPI(context, request, context.title) peopledir = find_peopledirectory(context) peopledir_tabs = get_tabs(peopledir, request, context.__name__) columns = [{ 'html': render_report_group(x, request, 'column'), 'width': getattr(x, 'width', 50) } for x in context.values()] columns = [x for x in columns if x['html']] return dict( api=api, peopledir=peopledir, peopledir_tabs=peopledir_tabs, context_tools=peopledir_tabs, columns=columns, actions=get_actions(context, request), )
def deactivate_profile_view(context, request): page_title = 'Deactivate user account for %s %s' % (context.firstname, context.lastname) api = TemplateAPI(context, request, page_title) name = context.__name__ myself = authenticated_userid(request) == context.__name__ if not api.user_is_admin and not myself: raise Forbidden("Only owner or admin can deactivate profile") confirm = request.params.get('confirm') if confirm: try: find_users(context).remove(name) except KeyError: pass workflow = get_workflow(IProfile, 'security', context) workflow.transition_to_state(context, request, 'inactive') if myself: return logout_view(context, request, reason='User removed') query = {'status_message': 'Deactivated user account: %s' % name} parent = context.__parent__ location = resource_url(parent, request, query=query) return HTTPFound(location=location) # Show confirmation page. return dict(api=api, myself=myself)
def __init__(self, context, request): self.context = context self.request = request self.community = find_interface(context, ICommunity) self.profiles = find_profiles(context) self.api = TemplateAPI(context, request) self.filestore = get_filestore(context, request, 'accept-invitation')
def followed_chatter(context, request): """ HTML wrapper for 'followed_chatter_json'. """ userid = authenticated_userid(request) other_user = getattr(request, 'chatter_user_id', None) if other_user is not None: request.GET['creators'] = other_user return creators_chatter(context, request) layout = request.layout_manager.layout if layout is not None: layout.add_portlet('chatter.user_info') layout.add_portlet('chatter.show_only') layout.add_portlet('chatter.search') info = followed_chatter_json(context, request) info['api'] = TemplateAPI(context, request, 'Posts') chatter_url = resource_url(find_chatter(context), request) info['chatter_url'] = chatter_url info['chatter_form_url'] = '%sadd_chatter.html' % chatter_url info['context_tools'] = get_context_tools(request) info['page_title'] = 'Chatter: Posts' info['pushdown'] = False info['inline'] = False info['show_more'] = len(info['recent']) >= 40 profiles = find_profiles(request.context) profile = profiles.get(userid) if profile is not None: profile.last_chatter_query = datetime.datetime.utcnow() return info
def __call__(self): page_title = 'Edit %s' % self.context.title layout = self.request.layout_manager.layout layout.section_style = "none" layout.page_title = page_title page_title = 'Edit %s' % self.context.title api = TemplateAPI(self.context, self.request, page_title) return {'api':api, 'actions':()}
def profile_thumbnail(context, request): api = TemplateAPI(context, request, 'Profile thumbnail redirector') photo = context.get('photo') if photo is not None: url = thumb_url(photo, request, PROFILE_THUMB_SIZE) else: url = api.static_url + "/images/defaultUser.gif" return HTTPFound(location=url)
def community_feed_view(context, request): api = TemplateAPI(context, request, 'Latest Activity') return { 'api': api, 'show_filter': False, 'page_title': 'Latest Activity', 'sticky_filter': 'community:%s' % context.__name__, }
def reset_sent_view(context, request): page_title = 'Password Reset Instructions Sent' api = TemplateAPI(context, request, page_title) return render_to_response( 'templates/reset_sent.pt', dict(api=api, email=request.params.get('email')), request=request, )