Ejemplo n.º 1
0
Archivo: api.py Proyecto: boothead/karl
    def __init__(self, context, request, page_title=None):
        self.context = context
        self.request = request
        self.snippets = get_template("templates/snippets.pt")
        self.snippets.doctype = xhtml
        self.userid = authenticated_userid(request)
        self.app_url = app_url = request.application_url
        self.profile_url = app_url + "/profiles/%s" % self.userid
        self.here_url = self.context_url = model_url(context, request)
        self.view_url = model_url(context, request, request.view_name)
        settings = queryUtility(ISettings)
        self.js_devel_mode = settings and getattr(settings, "js_devel_mode", None)
        self.static_url = "%s/static/%s" % (app_url, _get_static_rev())

        # Provide a setting in the INI to fully control the entire URL
        # to the static.  This is when the proxy runs a different port
        # number, or to "pipeline" resources on a different URL path.
        full_static_path = getattr(settings, "full_static_path", False)
        if full_static_path:
            if "%d" in full_static_path:
                full_static_path = full_static_path % _start_time
            self.static_url = full_static_path
        self.page_title = page_title
        self.system_name = get_setting(context, "system_name", "KARL")
        self.user_is_admin = "group.KarlAdmin" in effective_principals(request)
        site = find_site(context)
        self.admin_url = model_url(site, request, "admin.html")
        self.site_announcement = getattr(site, "site_announcement", "")
Ejemplo n.º 2
0
def _get_criteria(request):
    principals = effective_principals(request)
    principals = [x for x in principals if not x.startswith('system.')]

    # Check to see if we're asking for only "my" communities.
    filterby = request.params.get('filter', '')
    # cookie must be set even if param is empty or non-existent, to make
    # the no-filter button sticky.
    header = ('Set-Cookie', '%s=%s; Path=/' % (_FILTER_COOKIE, str(filterby)))
    request.cookies[_FILTER_COOKIE] = filterby
    request.response_headerlist = [header]

    if filterby == 'mycommunities':
        principals = [x for x in principals if not x.startswith('group.Karl')]

    if filterby == 'mycontent':
        created_by = authenticated_userid(request)
    elif filterby.startswith('profile:'):
        created_by = filterby[len('profile:'):]
    elif filterby.startswith('community:'):
        created_by = None
        community = filterby[len('community:'):]
        prefix = 'group.community:%s' % community
        principals = [x for x in principals if x.startswith(prefix)]
    else:
        created_by = None

    return principals, created_by
Ejemplo n.º 3
0
def get_my_communities(communities_folder, request, ignore_preferred=False):
    # sorted by title
    principals = effective_principals(request)
    communities = {}

    for name, role in get_community_groups(principals):
        if name in communities:
            continue
        try:
            community = communities_folder[name]
        except KeyError:
            continue
        communities[name] = (community.title, community)

    communities = communities.values()
    communities.sort()
    communities = [ x[1] for x in communities ]
    preferred = get_preferred_communities(communities_folder, request)
    # if preferred list is empty show all instead of nothing
    if preferred == []:
        ignore_preferred = True
    my_communities = []
    for community in communities:
        adapted = getMultiAdapter((community, request), ICommunityInfo)
        if not ignore_preferred and preferred is not None \
            and adapted.title in preferred:
            my_communities.append(adapted)
        if preferred is None or ignore_preferred:
            my_communities.append(adapted)
    return my_communities
Ejemplo n.º 4
0
def _show_communities_view_helper(context,
                                  request,
                                  prefix='',
                                  **kw
                                 ):
    # Grab the data for the two listings, main communities and portlet
    communities_path = model_path(context)

    query = dict(
        sort_index='title',
        interfaces=[ICommunity],
        path={'query': communities_path, 'depth': 1},
        allowed={'query': effective_principals(request), 'operator': 'or'},
        **kw
        )

    qualifiers = []
    titlestartswith = request.params.get('titlestartswith')
    if titlestartswith:
        query['titlestartswith'] = (titlestartswith, titlestartswith)
        qualifiers.append("Communities that begin with '%s'" % titlestartswith)

    body = request.params.get('body')
    if body:
        query['texts'] = body
        qualifiers.append('Search for "%s"' % body)

    error = None
    try:
        batch_info = get_catalog_batch_grid(context, request, **query)
    except ParseError, e:
        batch_info = { 'entries': [], 'batching_required': False }
        error = 'Error: %s' % e
Ejemplo n.º 5
0
def get_members_batch(community, request, size=10):
    mods = list(community.moderator_names)
    members = list(community.member_names - community.moderator_names)
    any = list(community.member_names | community.moderator_names)
    principals = effective_principals(request)
    searcher = ICatalogSearch(community)
    total, docids, resolver = searcher(interfaces=[IProfile],
                                       limit=size,
                                       name={'query': any,
                                             'operator': 'or'},
                                       allowed={'query': principals,
                                                'operator': 'or'},
                                      )
    mod_entries = []
    other_entries = []

    for docid in docids:
        model = resolver(docid)
        if model is not None:
            if model.__name__ in mods:
                mod_entries.append(model)
            else:
                other_entries.append(model)

    return (mod_entries + other_entries)[:size]
Ejemplo n.º 6
0
def get_batch(context, request):
    """Return a batch of results and term sequence for a search request.

    If the user provided no terms, the returned batch will be None and the
    term sequence will be empty.
    """
    batch = None
    terms = ()
    kind = request.params.get("kind")
    if not kind:
        # Search form
        query, terms = make_query(context, request)
        if terms:
            context_path = model_path(context)
            if context_path and context_path != "/":
                query["path"] = {"query": context_path}
            principals = effective_principals(request)
            query["allowed"] = {"query": principals, "operator": "or"}
            batch = get_catalog_batch_grid(context, request, **query)

    else:
        # LiveSearch
        text_term = request.params.get("body")
        if text_term:
            searcher = queryUtility(IGroupSearchFactory, kind)
            if searcher is None:
                # If the 'kind' we got is not known, return an error
                fmt = "The LiveSearch group %s is not known"
                raise HTTPBadRequest(fmt % kind)

            batch = searcher(context, request, text_term).get_batch()
            terms = [text_term, kind]

    return batch, terms
Ejemplo n.º 7
0
def get_recent_items_batch(community, request, size=10):
    batch = get_catalog_batch_grid(
        community, request, interfaces=[ICommunityContent],
        sort_index="modified_date", reverse=True, batch_size=size,
        path={'query': model_path(community)},
        allowed={'query': effective_principals(request), 'operator': 'or'},
    )
    return batch
Ejemplo n.º 8
0
def number_of_comments(forum, request):
    searcher = ICatalogSearch(forum)
    total, docids, resolver = searcher(
        interfaces=[IComment],
        path={'query': model_path(forum)},
        allowed={'query': effective_principals(request), 'operator': 'or'},
        )
    return total
Ejemplo n.º 9
0
def jquery_livesearch_view(context, request):
    # Prefix search is with a wildcard at the end
    searchterm = request.params.get("val", None)

    if searchterm is None:
        # The request forgot to send the key we use to do a search, so
        # make a friendly error message.  Important for the unit test.
        msg = "Client failed to send a 'val' parameter as the searchterm"
        return HTTPBadRequest(msg)
    else:
        searchterm = searchterm + "*"

    records = LivesearchResults()
    principals = effective_principals(request)

    site_path = model_path(context)

    records.set_header("", pre='<div class="header"></div>')
    records.append_to(
        rowclass="showall",
        title="Show All",
        href=model_url(context, request, "searchresults.html", query={"body": searchterm}),
    )

    for listitem in get_listitems(IGroupSearchFactory):
        utility = listitem["component"]

        factory = utility(context, request, searchterm)

        if factory is None:
            continue

        try:
            num, docids, resolver = factory()
        except ParseError:
            continue

        groupname = listitem["title"]

        records.set_header(groupname, pre='<div class="header">%s</div>' % (groupname,))

        results = filter(None, map(resolver, docids))

        qs = {"body": searchterm, "kind": groupname}
        sr_href = model_url(context, request, "searchresults.html", query=qs)

        for result in results:
            records.append_to(
                rowclass="result", title=getattr(result, "title", "<No Title>"), href=model_url(result, request)
            )

        if results:
            records.append_to(rowclass="showall", title="Show All", href=sr_href)
        else:
            records.append_to(rowclass="noresult", title="No Result", href=sr_href)

    result = JSONEncoder().encode(list(records))
    return Response(result, content_type="application/x-json")
Ejemplo n.º 10
0
 def _makeCriteria(self):
     principals = effective_principals(self.request)
     # this is always assumed to be a global search; it does no
     # path filtering
     criteria = {}
     criteria['sort_index'] = 'texts'
     criteria['texts'] = self.term
     criteria['interfaces'] = {'query':self.interfaces, 'operator':'or'}
     criteria['allowed'] = {'query':principals, 'operator':'or'}
     return criteria
Ejemplo n.º 11
0
def get_catalog_events(context, request,
                       searchterm=None, year=None, month=None,
                       past_events=None):

    # Build up a query
    query = dict(
        path={'query': model_path(context)},
        allowed={'query': effective_principals(request), 'operator': 'or'},
        interfaces=[ICalendarEvent],
        sort_index="start_date",
        reverse=True,
        use_cache=False,
        )

    if searchterm is not None:
        query['texts'] = searchterm

    if year is not None or month is not None:
        if year is not None:
            year = int(year)
        else:
            # No year given, assume this year
            year = datetime.datetime.now().year

        if month is not None:
            month = int(month)
            last_day = calendar.monthrange(year, month)[1]
            first_moment = coarse_datetime_repr(
                datetime.datetime(year, month, 1))
            last_moment = coarse_datetime_repr(
                datetime.datetime(year, month, last_day, 23, 59, 59))

        else:
            # No month given, search entire year
            first_moment = coarse_datetime_repr(datetime.datetime(year, 1, 1))
            last_moment = coarse_datetime_repr(datetime.datetime(year+1, 1, 1))

        query['start_date'] = (None, last_moment)
        query['end_date'] = (first_moment, None)

    else:
        # Show either all future or all past events
        now = coarse_datetime_repr(datetime.datetime.now())
        if past_events:
            # Past; show the most recent first
            query['end_date'] = (None, now)
            query['reverse'] = True
        else:
            # Future; show the soonest first
            query['end_date'] = (now, None)
            query['reverse'] = False

    batch = get_catalog_batch_grid(context, request, **query)

    return batch
Ejemplo n.º 12
0
def get_report_query(report, request):
    """Produce query parameters for a catalog search
    """
    kw = report.getQuery()
    principals = effective_principals(request)
    kw['allowed'] = {'query': principals, 'operator': 'or'}
    letter = request.params.get('lastnamestartswith')
    if letter:
        kw['lastnamestartswith'] = letter.upper()
    body = request.params.get('body')
    if body:
        kw['texts'] = body.strip() + '*'
    return kw
Ejemplo n.º 13
0
def _member_profile_batch(context, request):
    community = find_interface(context, ICommunity)
    member_names = community.member_names
    profiles_path = model_path(find_profiles(context))
    batch = get_catalog_batch(
        context, request,
        batch_size = 12,
        interfaces = [IProfile],
        path={'query': profiles_path, 'depth': 1},
        allowed={'query': effective_principals(request), 'operator': 'or'},
        name = list(member_names),
        sort_index='lastfirst',
        )
    return batch
Ejemplo n.º 14
0
def latest_object(forum, request):
    searcher = ICatalogSearch(forum)
    total, docids, resolver = searcher(
        sort_index='modified_date',
        interfaces={'query': [IForumTopic, IComment], 'operator':'or'},
        path={'query': model_path(forum)},
        allowed={'query': effective_principals(request), 'operator': 'or'},
        reverse=True)

    docids = list(docids)
    if docids:
        return resolver(docids[0])
    else:
        return None
Ejemplo n.º 15
0
def get_catalog_news(context, request,
                     searchterm=None, year=None, month=None):

    # Build up a query
    query = dict(
        path={'query': model_path(context)},
        allowed={'query': effective_principals(request), 'operator': 'or'},
        interfaces=[INewsItem],
        sort_index="publication_date",
        reverse=True,
        )

    if searchterm is not None:
        query['texts'] = searchterm

    now = coarse_datetime_repr(datetime.datetime.now())
    if year is not None or month is not None:
        if year is not None:
            year = int(year)
        else:
            # No year given, assume this year
            year = datetime.datetime.now().year

        if month is not None:
            month = int(month)
            last_day = calendar.monthrange(year, month)[1]
            first_moment = coarse_datetime_repr(
                datetime.datetime(year, month, 1))
            last_moment = coarse_datetime_repr(
                datetime.datetime(year, month, last_day, 23, 59, 59))

        else:
            # No month given, search entire year
            first_moment = coarse_datetime_repr(datetime.datetime(year, 1, 1))
            last_moment = coarse_datetime_repr(datetime.datetime(year+1, 1, 1))

        # Never show news items that aren't published yet
        last_moment = min(last_moment, now)

        query['publication_date'] = (first_moment, last_moment)

    else:
        # Don't show news from future
        query['publication_date'] = (None, now)

    batch = get_catalog_batch_grid(context, request, **query)

    return batch
Ejemplo n.º 16
0
def get_report_query(report, request):
    """Produce query parameters for a catalog search"""
    kw = {}
    if report.query:
        kw.update(report.query)
    for catid, values in report.filters.items():
        kw['category_%s' % catid] = {'query': values, 'operator': 'or'}
    principals = effective_principals(request)
    kw['allowed'] = {'query': principals, 'operator': 'or'}
    letter = request.params.get('lastnamestartswith')
    if letter:
        kw['lastnamestartswith'] = letter.upper()
    body = request.params.get('body')
    if body:
        kw['texts'] = body.strip() + '*'
    return kw
Ejemplo n.º 17
0
def show_communities_view(context, request):
    system_name = get_setting(context, 'system_name', 'KARL')
    page_title = '%s Communities' % system_name
    actions = []

    if has_permission('create', context, request):
        actions.append(('Add Community', 'add_community.html'))
    api = TemplateAPI(context, request, page_title)

    # Grab the data for the two listings, main communities and portlet
    communities_path = model_path(context)

    query = dict(
        sort_index='title',
        interfaces=[ICommunity],
        path={'query': communities_path, 'depth': 1},
        allowed={'query': effective_principals(request), 'operator': 'or'},
        )

    titlestartswith = request.params.get('titlestartswith')
    if titlestartswith:
        query['titlestartswith'] = (titlestartswith, titlestartswith)

    batch_info = get_catalog_batch_grid(context, request, **query)

    communities = []
    for community in batch_info['entries']:
        adapted = getMultiAdapter((community, request), ICommunityInfo)
        communities.append(adapted)

    mgr = ILetterManager(context)
    letter_info = mgr.get_info(request)

    my_communities = get_my_communities(context, request)

    return render_template_to_response(
        'templates/communities.pt',
        api=api,
        actions=actions,
        communities=communities,
        my_communities=my_communities,
        batch_info=batch_info,
        letters=letter_info,
        )
Ejemplo n.º 18
0
def _get_catalog_events(calendar, request,
                        first_moment, last_moment, layer_name=None):

    searcher = ICatalogSearch(calendar)
    search_params = dict(
        allowed={'query': effective_principals(request), 'operator': 'or'},
        interfaces=[ICalendarEvent],
        sort_index='start_date',
        reverse=False,
        )

    if first_moment:
        end_date = (coarse_datetime_repr(first_moment), None)
        search_params['end_date'] = end_date

    if last_moment:
        start_date = (None, coarse_datetime_repr(last_moment))
        search_params['start_date'] = start_date

    docids_seen = set()

    events = []

    for layer in _get_calendar_layers(calendar):
        if layer_name and layer.__name__ != layer_name:
            continue

        total, docids, resolver = searcher(
            virtual={'query':layer.paths, 'operator':'or'},
            **search_params)

        for docid in docids:
            if docid not in docids_seen:
                docids_seen.add(docid)

                event = resolver(docid)
                event._v_layer_color = layer.color.strip()
                event._v_layer_title = layer.title

                events.append(event)

    return events
Ejemplo n.º 19
0
 def _makeCriteria(self):
     principals = effective_principals(self.request)
     # this is always assumed to be a global search; it does no
     # path filtering
     criteria = {}
     if self.term:
         criteria['sort_index'] = 'texts'
         q = WeightedQuery(self.term)
         if len(self.interfaces) == 1:
             q.marker = self.interfaces[0].queryTaggedValue('marker')
         criteria['texts'] = q
     interfaces = self.interfaces
     if not interfaces:
         interfaces = [IContent]
     criteria['interfaces'] = {'query':interfaces, 'operator':'or'}
     criteria['allowed'] = {'query':principals, 'operator':'or'}
     containment = self.containment
     if containment:
         criteria['containment'] = {'query': containment, 'operator': 'or'}
     return criteria
Ejemplo n.º 20
0
def recent_content_view(context, request):
    batch = get_catalog_batch(context, request,
        sort_index='creation_date', reverse=True,
        interfaces=[IContent], creator=context.__name__,
        allowed={'query': effective_principals(request), 'operator': 'or'},
        )

    recent_items = []
    for item in batch['entries']:
        adapted = getMultiAdapter((item, request), IGridEntryInfo)
        recent_items.append(adapted)

    page_title = "Content Added Recently by %s" % context.title
    api = TemplateAPI(context, request, page_title)
    return render_template_to_response(
        'templates/profile_recent_content.pt',
        api=api,
        batch_info=batch,
        recent_items=recent_items,
        )
Ejemplo n.º 21
0
def _get_all_calendar_categories(context, request):
    calendar_categories = []

    searcher = queryAdapter(context, ICatalogSearch)
    if searcher is not None:
        total, docids, resolver = searcher(
            allowed={'query': effective_principals(request), 'operator': 'or'},
            interfaces={'query':[ICalendarCategory],'operator':'or'},
            reverse=False,
            )

        for docid in docids:
            ob = resolver(docid)
            path = model_path(ob)
            folder = path.rsplit('/', 1)[0]
            title = _calendar_category_title(ob)
            calendar_categories.append({'title':title, 'path':path,
                                        'folder':folder})

    calendar_categories.sort(key=lambda x: (x['folder'], x['title']))
    return calendar_categories
Ejemplo n.º 22
0
    def recent_items(self):
        if self._recent_items is None:
            community = find_interface(self.context, ICommunity)
            if community is not None:
                community_path = model_path(community)
                search = getAdapter(self.context, ICatalogSearch)
                principals = effective_principals(self.request)
                self._recent_items = []
                num, docids, resolver = search(
                    limit=10,
                    path={"query": community_path},
                    allowed={"query": principals, "operator": "or"},
                    sort_index="modified_date",
                    reverse=True,
                    interfaces=[ICommunityContent],
                )
                models = filter(None, map(resolver, docids))
                for model in models:
                    adapted = getMultiAdapter((model, self.request), IGridEntryInfo)
                    self._recent_items.append(adapted)

        return self._recent_items
Ejemplo n.º 23
0
def get_my_communities(communities_folder, request):
    # sorted by title
    principals = effective_principals(request)
    communities = {}

    for name, role in get_community_groups(principals):
        if name in communities:
            continue
        try:
            community = communities_folder[name]
        except KeyError:
            continue
        communities[name] = (community.title, community)

    communities = communities.values()
    communities.sort()
    communities = [ x[1] for x in communities ]
    my_communities = []
    for community in communities:
        adapted = getMultiAdapter((community, request), ICommunityInfo)
        my_communities.append(adapted)
    return my_communities
Ejemplo n.º 24
0
def related_communities_ajax_view(context, request):
    assert ICommunity.providedBy(context), str(type(context))

    related = []
    principals = effective_principals(request)
    searcher = ICatalogSearch(context)
    search = ' OR '.join(context.title.lower().split())
    total, docids, resolver = searcher(interfaces=[ICommunity],
                                       limit=5,
                                       reverse=True,
                                       sort_index="modified_date",
                                       texts=search,
                                       allowed={'query': principals,
                                                'operator': 'or'},
                                      )
    for docid in docids:
        model = resolver(docid)
        if model is not None:
            if model is not context:
                adapted = getMultiAdapter((model, request), IGridEntryInfo)
                related.append(adapted)

    return {'items': related}
Ejemplo n.º 25
0
def get_images_batch(context,
                     request,
                     creator=None,   # 'My Recent' in imagedrawer
                     community=None, # 'This Community' in imagedrawer
                     batch_start=0,
                     batch_size=12,
                     sort_index='creation_date',
                     reverse=True,
                     batcher=get_catalog_batch):  # For unit testing
    search_params = dict(
        interfaces=[IImage,],
        allowed={'query': effective_principals(request), 'operator': 'or'},
        sort_index=sort_index,
        reverse=reverse,
        batch_start=batch_start,
        batch_size=batch_size,
    )

    if creator is not None:
        search_params['creator'] = creator
    if community is not None:
        search_params['path'] = community

    return batcher(context, request, **search_params)
Ejemplo n.º 26
0
    def __init__(self, context, request, page_title=None):
        site = find_site(context)
        self.context = context
        self.request = request
        self.userid = authenticated_userid(request)
        self.app_url = app_url = request.application_url
        self.profile_url = app_url + "/profiles/%s" % self.userid
        self.here_url = self.context_url = model_url(context, request)
        self.view_url = model_url(context, request, request.view_name)
        settings = queryUtility(ISettings)
        self.js_devel_mode = settings and getattr(settings, "js_devel_mode", None)
        self.read_only = settings and getattr(settings, "read_only", False)
        self.static_url = "%s/static/%s" % (app_url, _get_static_rev())

        # this data will be provided for the client javascript
        self.karl_client_data = {}

        # Provide a setting in the INI to fully control the entire URL
        # to the static.  This is when the proxy runs a different port
        # number, or to "pipeline" resources on a different URL path.
        full_static_path = getattr(settings, "full_static_path", False)
        if full_static_path:
            if "%d" in full_static_path:
                # XXX XXX note self._start_time is needed... and not _start_time
                # XXX XXX since this was a trivial bug, there is chance that
                # XXX XXX this actually never runs! TODO testing???
                full_static_path = full_static_path % self._start_time
            self.static_url = full_static_path
        self.page_title = page_title
        self.system_name = get_setting(context, "system_name", "KARL")
        self.user_is_admin = "group.KarlAdmin" in effective_principals(request)
        self.can_administer = has_permission("administer", site, request)
        self.can_email = has_permission("email", site, request)
        self.admin_url = model_url(site, request, "admin.html")
        self.site_announcement = getattr(site, "site_announcement", "")
        # XXX XXX XXX This will never work from peoples formish templates
        # XXX XXX XXX (edit_profile and derivates) because, in those form
        # XXX XXX XXX controllers, the api is instantiated from __init__,
        # XXX XXX XXX where request.form is still unset!!! (From all other
        # XXX XXX XXX formcontrollers the api is instantiated from __call__,
        # XXX XXX XXX which is why this works. A chicken-and-egg problem, really.
        if hasattr(request, "form") and getattr(request.form, "errors", False):
            # This is a failed form submission request, specify an error message
            self.error_message = u"Please correct the indicated errors."

        if settings:
            self.kaltura_info = dict(
                enabled=getattr(settings, "kaltura_enabled", False) in ("true", "True"),
                partner_id=getattr(settings, "kaltura_partner_id", ""),
                sub_partner_id=getattr(settings, "kaltura_sub_partner_id", ""),
                admin_secret=getattr(settings, "kaltura_admin_secret", ""),
                user_secret=getattr(settings, "kaltura_user_secret", ""),
                kcw_uiconf_id=getattr(settings, "kaltura_kcw_uiconf_id", "1000741"),
                player_uiconf_id=getattr(settings, "kaltura_player_uiconf_id", ""),
                player_cache_st=getattr(settings, "kaltura_player_cache_st", ""),
                local_user=self.userid,
            )
            if not getattr(settings, "kaltura_client_session", False) in ("true", "True"):
                # Secrets will not be sent to client, instead session is handled on the server.
                self.kaltura_info["session_url"] = app_url + "/" + "kaltura_create_session.json"
        else:
            self.kaltura_info = dict(enabled=False)

        # propagate the head data to the client
        d = self.karl_client_data["kaltura"] = dict(self.kaltura_info)
        # remove secrets if needed
        if "session_url" in d:
            # server side session management, do not send secrets to client
            del d["user_secret"]
            del d["admin_secret"]
Ejemplo n.º 27
0
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": model_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_template_to_response(
        "templates/profile.pt",
        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,
    )
Ejemplo n.º 28
0
def get_topic_batch(forum, request):
    return get_catalog_batch_grid(
        forum, request, interfaces=[IForumTopic], reverse=True,
        path={'query': model_path(forum)},
        allowed={'query': effective_principals(request), 'operator': 'or'},
        )
Ejemplo n.º 29
0
 def member(self):
     principals = set(effective_principals(self.request))
     members = set(self.context.member_names)
     return bool(principals & members)
Ejemplo n.º 30
0
 def groups(self):
     groups = [ principal for principal in effective_principals(self.request) if 'group:' in principal]
     return groups
Ejemplo n.º 31
0
 def groups(self):
     groups = [
         principal for principal in effective_principals(self.request)
         if 'group:' in principal
     ]
     return groups