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)
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)
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
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)