Exemplo n.º 1
0
def newest_feed_items(context, request):

    principals, created_by = _get_criteria(request)
    events = find_events(context)

    # Check to see if we're asking for most recent
    newer_than = request.params.get('newer_than')

    if newer_than:
        last_gen, last_index = newer_than.split(':')
        last_gen = long(last_gen)
        last_index = int(last_index)
        latest = list(
            events.newer(last_gen, last_index, principals, created_by))
    else:
        last_gen = -1L
        last_index = -1
        latest = list(islice(events.checked(principals, created_by), 20))

    if not latest:
        return (last_gen, last_index, last_gen, last_index, ())

    last_gen, last_index, ignored = latest[0]
    earliest_gen, earliest_index, ignored = latest[-1]

    feed_items = _update_feed_items(latest, request.application_url)

    return last_gen, last_index, earliest_gen, earliest_index, feed_items
Exemplo n.º 2
0
def older_feed_items(context, request):
    older_than = request.params.get('older_than')

    # If we don't have params, bail out.
    if older_than is None:
        return -1, -1, ()

    principals, created_by = _get_criteria(request)
    events = find_events(context)

    earliest_gen, earliest_index = older_than.split(':')
    earliest_gen = long(earliest_gen)
    earliest_index = int(earliest_index)
    older = list(
        islice(
            events.older(earliest_gen, earliest_index, principals, created_by),
            20))

    if not older:
        return (earliest_gen, earliest_index, ())

    earliest_gen, earliest_index, ignored = older[-1]

    feed_items = _update_feed_items(older, request.application_url)

    return earliest_gen, earliest_index, feed_items
Exemplo n.º 3
0
def newest_feed_items(context, request):

    principals, created_by = _get_criteria(request)
    events = find_events(context)

    # Check to see if we're asking for most recent
    newer_than = request.params.get('newer_than')

    if newer_than:
        last_gen, last_index = newer_than.split(':')
        last_gen = long(last_gen)
        last_index = int(last_index)
        latest = list(events.newer(last_gen, last_index,
                                   principals, created_by))
    else:
        last_gen = -1L
        last_index = -1
        latest = list(islice(events.checked(principals, created_by), 20))

    if not latest:
        return (last_gen, last_index, last_gen, last_index, ())

    last_gen, last_index, ignored = latest[0]
    earliest_gen, earliest_index, ignored = latest[-1]

    feed_items = _update_feed_items(latest, request.application_url)

    return last_gen, last_index, earliest_gen, earliest_index, feed_items
Exemplo n.º 4
0
def user_tagged_content(event):
    if ITagAddedEvent.providedBy(event):
        request = get_current_request()
        context = getattr(request, "context", None)
        if context is None:
            return
        events = find_events(context)
        if not events:
            return
        site = find_site(context)
        catalog = find_catalog(context)
        path = catalog.document_map.address_for_docid(event.item)
        tagged = find_resource(site, path)
        if tagged is None:
            return
        profile_id = event.user
        if profile_id in (None, "None"):
            return
        profile = site["profiles"][profile_id]
        info = _getInfo(profile, tagged)
        if info is None:
            return
        if info["content_type"] == "Community":
            info["flavor"] = "tagged_community"
        elif info["content_type"] == "Person":
            info["flavor"] = "tagged_profile"
        else:
            info["flavor"] = "tagged_other"
        info["operation"] = "tagged"
        info["tagname"] = event.name
        events.push(**info)
Exemplo n.º 5
0
def user_tagged_content(event):
    if ITagAddedEvent.providedBy(event):
        request = get_current_request()
        context = getattr(request, 'context', None)
        if context is None:
            return
        events = find_events(context)
        if not events:
            return
        site = find_site(context)
        catalog = find_catalog(context)
        path = catalog.document_map.address_for_docid(event.item)
        tagged = find_resource(site, path)
        if tagged is None:
            return
        profile_id = event.user
        if profile_id in (None, 'None'):
            return
        profile = site['profiles'][profile_id]
        info = _getInfo(profile, tagged)
        if info is None:
            return
        if info['content_type'] == 'Community':
            info['flavor'] = 'tagged_community'
        elif info['content_type'] == 'Person':
            info['flavor'] = 'tagged_profile'
        else:
            info['flavor'] = 'tagged_other'
        info['operation'] = 'tagged'
        info['tagname'] = event.name
        events.push(**info)
def feed_dump_csv(context, request):
    buf = StringIO()
    buf.write(','.join(_CSV_FIELD_NAMES) + '\n')
    writer = DictWriter(buf, _CSV_FIELD_NAMES)
    for gen, index, event_info in find_events(context):
        for key in list(event_info):
            if key not in _CSV_FIELD_NAMES:
                del event_info[key]
        for key, xform in _CSV_MAP.items():
            event_info[key] = xform(event_info.get(key))
        writer.writerow(event_info)
    response = Response(buf.getvalue())
    response.content_type = 'application/x-csv'
    response.headers.add('Content-Disposition',
                         'attachment;filename=feed_dump.csv')
    return response
Exemplo n.º 7
0
def feed_dump_csv(context, request):
    buf = StringIO()
    buf.write(','.join(_CSV_FIELD_NAMES) + '\n')
    writer = DictWriter(buf, _CSV_FIELD_NAMES)
    for gen, index, event_info in find_events(context):
        info = event_info.copy()
        for key in list(info):
            if key not in _CSV_FIELD_NAMES:
                del info[key]
        for key, xform in _CSV_MAP.items():
            info[key] = xform(info.get(key))
        writer.writerow(info)
    response = Response(buf.getvalue())
    response.content_type = 'application/x-csv'
    response.headers.add('Content-Disposition',
                         'attachment;filename=feed_dump.csv')
    return response
Exemplo n.º 8
0
def user_left_community(event):
    if IUserRemovedGroup.providedBy(event):
        delta = event.old_groups - event.groups
        left = [x for x in delta if x.startswith(MEMBER_PREFIX)]
        events = find_events(event.site)
        if not events or not left:
            return
        profile = event.site["profiles"][event.id]
        for group in left:
            community_id, gtype = group[len(MEMBER_PREFIX) :].split(":")
            if gtype == "members":
                community = event.site["communities"].get(community_id)
                if community is None:
                    continue
                info = _getInfo(profile, community)
                info["flavor"] = "joined_left"
                info["operation"] = "left"
                events.push(**info)
Exemplo n.º 9
0
def user_left_community(event):
    if IUserRemovedGroup.providedBy(event):
        delta = event.old_groups - event.groups
        left = [x for x in delta if x.startswith(MEMBER_PREFIX)]
        events = find_events(event.site)
        if not events or not left:
            return
        profile = event.site['profiles'][event.id]
        for group in left:
            community_id, gtype = group[len(MEMBER_PREFIX):].split(':')
            if gtype == 'members':
                community = event.site['communities'].get(community_id)
                if community is None:
                    continue
                info = _getInfo(profile, community)
                info['flavor'] = 'joined_left'
                info['operation'] = 'left'
                events.push(**info)
Exemplo n.º 10
0
def user_modified_content(modified, event):
    if IObjectModifiedEvent.providedBy(event):
        events = find_events(modified)
        if not events:
            return
        site = find_site(modified)
        profile_id = getattr(modified, "modified_by", None)
        if profile_id in (None, "None"):
            return
        profile = site["profiles"][profile_id]
        info = _getInfo(profile, modified)
        if info is None:
            return
        if info["content_type"] == "Community":
            info["flavor"] = "added_edited_community"
        elif info["content_type"] == "Person":
            info["flavor"] = "added_edited_profile"
        else:
            info["flavor"] = "added_edited_other"
        info["operation"] = "edited"
        events.push(**info)
Exemplo n.º 11
0
def user_modified_content(modified, event):
    if IObjectModifiedEvent.providedBy(event):
        events = find_events(modified)
        if not events:
            return
        site = find_site(modified)
        profile_id = getattr(modified, 'modified_by', None)
        if profile_id in (None, 'None'):
            return
        profile = site['profiles'][profile_id]
        info = _getInfo(profile, modified)
        if info is None:
            return
        if info['content_type'] == 'Community':
            info['flavor'] = 'added_edited_community'
        elif info['content_type'] == 'Person':
            info['flavor'] = 'added_edited_profile'
        else:
            info['flavor'] = 'added_edited_other'
        info['operation'] = 'edited'
        events.push(**info)
Exemplo n.º 12
0
def older_feed_items(context, request):
    older_than = request.params.get('older_than')

    # If we don't have params, bail out.
    if older_than is None:
        return -1, -1, ()

    principals, created_by = _get_criteria(request)
    events = find_events(context)

    earliest_gen, earliest_index = older_than.split(':')
    earliest_gen = long(earliest_gen)
    earliest_index = int(earliest_index)
    older = list(islice(events.older(earliest_gen, earliest_index,
                                principals, created_by), 20))

    if not older:
        return (earliest_gen, earliest_index, ())

    earliest_gen, earliest_index, ignored = older[-1]

    feed_items = _update_feed_items(older, request.application_url)

    return earliest_gen, earliest_index, feed_items
Exemplo n.º 13
0
def rename_user(context, old_name, new_name, merge=False, out=None):
    """
    Renames a user with the given userid to a new userid. If `merge` is `True`
    a user is expected to already exist with userid `new_name`. Moves all
    content and group memberships from old user to new user before removing the
    old user.
    """
    profiles = find_profiles(context)
    users = find_users(context)

    old_user = users.get_by_id(old_name)
    old_profile = profiles.get(old_name)
    if not old_profile:
        raise ValueError("No such profile: %s" % old_name)
    old_title = old_profile.title

    if merge:
        if old_user is not None and users.get_by_id(new_name) is None:
            raise ValueError("No such user: %s" % new_name)
        if new_name not in profiles:
            raise ValueError("No such profile: %s" % new_name)
        new_title = profiles[new_name].title

        if out is not None:
            print >> out, "Merging user from %s to %s." % (old_name, new_name)

        if old_user is not None:
            for group in old_user['groups']:
                if not users.member_of_group(new_name, group):
                    users.add_user_to_group(new_name, group)
            users.remove(old_name)
        del profiles[old_name]

    else:
        if users.get_by_id(new_name) is not None:
            raise ValueError("User already exists: %s" % new_name)
        if new_name in profiles:
            raise ValueError("Profile already exists: %s" % new_name)
        new_title = None

        if out is not None:
            print >> out, "Renaming user %s to %s." % (old_name, new_name)

        if old_user is not None:
            users.add(new_name,
                      new_name,
                      old_user['password'],
                      old_user['groups'],
                      encrypted=True)
            users.remove(old_name)

        profile = profiles[old_name]
        del profiles[old_name]
        profiles[new_name] = profile

    catalog = find_catalog(context)
    search = ICatalogSearch(context)

    index = catalog['creator']
    count, docids, resolver = search(creator=old_name)
    for docid in docids:
        doc = resolver(docid)
        if out is not None:
            print >> out, "Updating creator for %s." % resource_path(doc)
        doc.creator = new_name
        index.reindex_doc(docid, doc)

    index = catalog['modified_by']
    count, docids, resolver = search(modified_by=old_name)
    for docid in docids:
        doc = resolver(docid)
        if out is not None:
            print >> out, "Updating modified_by for %s." % resource_path(doc)
        doc.modified_by = new_name
        index.reindex_doc(docid, doc)

    content_feed = find_events(context)
    if content_feed:
        for gen, index, event in content_feed.checked(None, old_name):
            for key, value in event.items():
                if isinstance(value, basestring):
                    if old_name in value:
                        event[key] = value.replace(old_name, new_name)
                    if new_title and old_title in value:
                        event[key] = value.replace(old_title, new_title)
Exemplo n.º 14
0
def rename_user(context, old_name, new_name, merge=False, out=None):
    """
    Renames a user with the given userid to a new userid. If `merge` is `True`
    a user is expected to already exist with userid `new_name`. Moves all
    content and group memberships from old user to new user before removing the
    old user.
    """
    profiles = find_profiles(context)
    users = find_users(context)

    old_user = users.get_by_id(old_name)
    old_profile = profiles.get(old_name)
    if not old_profile:
        raise ValueError("No such profile: %s" % old_name)
    old_title = old_profile.title

    if merge:
        if old_user is not None and users.get_by_id(new_name) is None:
            raise ValueError("No such user: %s" % new_name)
        if new_name not in profiles:
            raise ValueError("No such profile: %s" % new_name)
        new_title = profiles[new_name].title

        if out is not None:
            print >>out, "Merging user from %s to %s." % (old_name, new_name)

        if old_user is not None:
            for group in old_user['groups']:
                if not users.member_of_group(new_name, group):
                    users.add_user_to_group(new_name, group)
            users.remove(old_name)
        del profiles[old_name]

    else:
        if users.get_by_id(new_name) is not None:
            raise ValueError("User already exists: %s" % new_name)
        if new_name in profiles:
            raise ValueError("Profile already exists: %s" % new_name)
        new_title = None

        if out is not None:
            print >>out, "Renaming user %s to %s." % (old_name, new_name)

        if old_user is not None:
            users.add(new_name, new_name, old_user['password'],
                      old_user['groups'], encrypted=True)
            users.remove(old_name)

        profile = profiles[old_name]
        del profiles[old_name]
        profiles[new_name] = profile

    catalog = find_catalog(context)
    search = ICatalogSearch(context)

    index = catalog['creator']
    count, docids, resolver = search(creator=old_name)
    for docid in docids:
        doc = resolver(docid)
        if out is not None:
            print >>out, "Updating creator for %s." % resource_path(doc)
        doc.creator = new_name
        index.reindex_doc(docid, doc)

    index = catalog['modified_by']
    count, docids, resolver = search(modified_by=old_name)
    for docid in docids:
        doc = resolver(docid)
        if out is not None:
            print >>out, "Updating modified_by for %s." % resource_path(doc)
        doc.modified_by = new_name
        index.reindex_doc(docid, doc)

    content_feed = find_events(context)
    if content_feed:
        for gen, index, event in content_feed.checked(None, old_name):
            for key, value in event.items():
                if isinstance(value, basestring):
                    if old_name in value:
                        event[key] = value.replace(old_name, new_name)
                    if new_title and old_title in value:
                        event[key] = value.replace(old_title, new_title)