示例#1
0
def unsubscribe(request, group, user):
    """Unsubscribe @user from @group.
    Remove the user from group-followers, group from user-groups,
    create a group-leave activity item and push item to group-followers
    and group feed. Remove the group from user display name indices.

    Raises an error if user is not member of group or when
    user is the only administrator of the group.

    keyword params:
    @user: entity object of user
    @group: entity object of the group
    @request:

    """
    try:
        yield db.get(group.id, "groupMembers", user.id)
    except ttypes.NotFoundException:
        raise errors.InvalidRequest(_("You are not a member of the group"))

    if len(getattr(group, 'admins', {}).keys()) == 1 \
       and user.id in group.admins:
        raise errors.InvalidRequest(_("You are the only administrator of this group"))

    colname = _entityGroupMapColName(group)
    itemType = "activity"
    responseType = "I"

    itemId = utils.getUniqueKey()
    acl = {"accept": {"groups": [group.id]}}
    _acl = pickle.dumps(acl)
    item = yield utils.createNewItem(request, itemType, user,
                                     acl, "groupLeave")
    item["meta"]["target"] = group.id

    d1 = db.remove(group.id, "followers", user.id)
    d2 = db.remove(user.id, "entityGroupsMap", colname)
    d3 = db.batch_insert(itemId, 'items', item)
    d4 = db.remove(group.id, "groupMembers", user.id)
    d5 = feed.pushToOthersFeed(user.id, user.basic['org'],
                               item["meta"]["uuid"], itemId, itemId, _acl,
                               responseType, itemType, user.id,
                               promoteActor=False)
    d6 = utils.updateDisplayNameIndex(user.id, [group.id], None,
                                      user.basic['name'])
    deferreds = [d1, d2, d3, d4, d5, d6]
    if user.id in group.admins:
        d7 = db.remove(group.id, "entities", user.id, "admins")
        d8 = db.remove(user.id, "entities", group.id, "adminOfGroups")
        deferreds.extend([d7, d8])

    yield defer.DeferredList(deferreds)
示例#2
0
def _addMember(request, group, user):
    """Add a new member to the group.
    Add user to group followers, create a group-join activity item and push
    item to group, group-followers feed. Update user groups with new group.

    Keyword params:
    @group: entity object of the group
    @user: entity object of the user
    @request:

    """
    deferreds = []
    itemType = "activity"
    relation = Relation(user.id, [])
    if not getattr(user, 'basic', []):
        yield user.fetchData(['basic'])

    responseType = "I"
    acl = {"accept": {"groups": [group.id]}}
    _acl = pickle.dumps(acl)

    itemId = utils.getUniqueKey()
    colname = _entityGroupMapColName(group)
    yield db.insert(user.id, "entityGroupsMap", "", colname)
    yield db.insert(group.id, "groupMembers", itemId, user.id)
    item = yield utils.createNewItem(request, "activity", user,
                                     acl, "groupJoin")
    item["meta"]["target"] = group.id

    d1 = db.insert(group.id, "followers", "", user.id)
    d2 = db.batch_insert(itemId, 'items', item)
    d3 = feed.pushToFeed(group.id, item["meta"]["uuid"], itemId,
                         itemId, responseType, itemType, user.id)
    d4 = feed.pushToOthersFeed(user.id, user.basic['org'],
                                item["meta"]["uuid"], itemId,
                                itemId, _acl, responseType,
                                itemType, user.id, promoteActor=False)

    d5 = utils.updateDisplayNameIndex(user.id, [group.id],
                                      user.basic['name'], None)

    deferreds = [d1, d2, d3, d4, d5]
    yield defer.DeferredList(deferreds)
示例#3
0
def removeUser(group, user, me):
    """Remove user from the group.
    Only group-admin can perform this action.

    Keyword params
    @me:
    @user: user object
    @group: group object
    """
    if me.id not in group.admins:
        raise errors.PermissionDenied('Access Denied')

    if len(getattr(group, 'admins', {})) == 1 and me.id == user.id:
        raise errors.InvalidRequest(_("You are currently the only administrator of this group"))

    try:
        cols = yield db.get(group.id, "groupMembers", user.id)
        itemId = cols.column.value
        username = user.basic['name']
        colName = _entityGroupMapColName(group)
        d1 = db.remove(itemId, "items")
        d2 = db.remove(group.id, "followers", user.id)

        d3 = db.remove(user.id, "entityGroupsMap", colName)
        d4 = db.remove(group.id, "groupMembers", user.id)
        d5 = utils.updateDisplayNameIndex(user.id, [group.id], '', username)
        deferreds = [d1, d2, d3, d4, d5]

        if user.id in group.admins:
            d6 = db.remove(group.id, 'entities', user.id, 'admins')
            d7 = db.remove(user.id, 'entities', group.id, 'adminOfGroups')
            deferreds.extend([d6, d7])

        #XXX: remove item from feed?
        yield defer.DeferredList(deferreds)
        defer.returnValue(True)

    except ttypes.NotFoundException:
        pass
示例#4
0
    def _editBasicInfo(self, request):
        authInfo = request.getSession(IAuthInfo)
        myId = authInfo.username
        orgId = authInfo.organization

        userInfo = {"basic":{}}
        to_remove = []
        basicUpdatedInfo, basicUpdated = {}, False

        me = base.Entity(myId)
        yield me.fetchData([])

        # Check if any basic information is being updated.
        for cn in ("jobTitle", "name", "firstname", "lastname", "timezone"):
            val = utils.getRequestArg(request, cn)
            if not val and cn in ['name', 'jobTitle', 'timezone']:
                request.write("<script>parent.$$.alerts.error('One or more required parameters are missing')</script>")
                raise errors.MissingParams(_([cn]))
            if val:
                userInfo["basic"][cn] = val
                basicUpdatedInfo[cn] = val
            elif cn in ["firstname", "lastname"]:
                to_remove.append(cn)
                basicUpdatedInfo[cn] = ""
            if me.basic.get(cn, None) != userInfo['basic'].get(cn, None):
                basicUpdated = True

        # Update name indicies of organization.
        nameIndexKeys = [orgId]
        nameIndicesDeferreds = []
        oldNameParts = []
        newNameParts = []
        for field in ["name", "lastname", "firstname"]:
            if field in basicUpdatedInfo:
                newNameParts.extend(basicUpdatedInfo[field].split())
                oldNameParts.extend(me.basic.get(field, '').split())
                if field == 'name':
                    d1 = utils.updateDisplayNameIndex(myId, nameIndexKeys,
                                                      basicUpdatedInfo[field],
                                                      me.basic.get(field, None))
                    nameIndicesDeferreds.append(d1)
        d = utils.updateNameIndex(myId, nameIndexKeys,
                                  " ".join(newNameParts),
                                  " ".join(oldNameParts))
        nameIndicesDeferreds.append(d)

        # Avatar (display picture)
        dp = utils.getRequestArg(request, "dp", sanitize=False)
        if dp:
            avatar = yield saveAvatarItem(myId, orgId, dp)
            userInfo["basic"]["avatar"] = avatar
            me.basic["avatar"] = avatar
            avatarURI = utils.userAvatar(myId, me)
            basicUpdatedInfo["avatar"] = avatarURI
            basicUpdated = True
        if userInfo["basic"]:
            yield db.batch_insert(myId, "entities", userInfo)
            me.basic.update(userInfo['basic'])
            yield search.solr.updatePeopleIndex(myId, me, orgId)

        if to_remove:
            yield db.batch_remove({'entities':[myId]}, names=to_remove, supercolumn='basic')

        if basicUpdated:
            response = """
                        <script>
                            var data = %s;
                            if (data.avatar){
                              var imageUrl = data.avatar;
                              parent.$('#avatar').css('background-image', 'url(' + imageUrl + ')');
                            }
                            parent.$('#name').html(data.name + ', ' + data.jobTitle);
                            parent.$$.alerts.info("%s");
                        </script>
                        """ % (json.dumps(basicUpdatedInfo),  _("Profile updated"))
            request.write(response)

        # Wait for name indices to be updated.
        if nameIndicesDeferreds:
            yield defer.DeferredList(nameIndicesDeferreds)

        args = {"detail": "", "me": me}
        suggestedSections = yield self._checkProfileCompleteness(request, myId, args)
        tmp_suggested_sections = {}
        for section, items in suggestedSections.iteritems():
            if len(suggestedSections[section]) > 0:
                tmp_suggested_sections[section] = items
        args.update({'suggested_sections':tmp_suggested_sections})

        t.renderScriptBlock(request, "settings.mako", "right",
                            False, ".right-contents", "set", **args)