예제 #1
0
    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)
예제 #2
0
 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}
예제 #3
0
파일: stats.py 프로젝트: iotest3/new
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,
    )
예제 #4
0
 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': []}
예제 #5
0
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))
예제 #6
0
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))
예제 #7
0
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))
예제 #8
0
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
    )
예제 #9
0
파일: wiki.py 프로젝트: iotest3/new
 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': ()}
예제 #10
0
파일: resource.py 프로젝트: zagy/karl
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,
    }
예제 #11
0
파일: people.py 프로젝트: zagy/karl
 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
예제 #12
0
파일: chatter.py 프로젝트: zagy/karl
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'
    }
예제 #13
0
파일: chatter.py 프로젝트: zagy/karl
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
예제 #14
0
파일: chatter.py 프로젝트: zagy/karl
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,
    }
예제 #15
0
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)
    }
예제 #16
0
파일: chatter.py 프로젝트: zagy/karl
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
예제 #17
0
파일: members.py 프로젝트: zagy/karl
    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
        }
예제 #18
0
파일: retail.py 프로젝트: iotest3/new
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,
    )
예제 #19
0
파일: people.py 프로젝트: zagy/karl
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,
        )
예제 #20
0
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))
예제 #21
0
 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}
예제 #22
0
def opensearch_view(context, request):
    api = TemplateAPI(context, request, 'KARL People OpenSearch')
    return dict(
        api=api,
        report=context,
        url=resource_url(context, request),
    )
예제 #23
0
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),
    )
예제 #24
0
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)
예제 #25
0
파일: members.py 프로젝트: zagy/karl
 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')
예제 #26
0
파일: chatter.py 프로젝트: zagy/karl
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
예제 #27
0
 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':()}
예제 #28
0
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)
예제 #29
0
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__,
    }
예제 #30
0
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,
    )