def role(self, role): prev_role = self._role self._role = GROUP_EDGE_ROLES.index(role) # Groups should always "member". if not (OBJ_TYPES_IDX[self.member_type] == "User"): return # If ownership status is unchanged, no notices need to be adjusted. if (self._role in OWNER_ROLE_INDICES) == (prev_role in OWNER_ROLE_INDICES): return recipient = User.get(self.session, pk=self.member_pk).username expiring_supergroups = self.group.my_expiring_groups() member_name = self.group.name if role in ["owner", "np-owner"]: # We're creating a new owner, who should find out when this group # they now own loses its membership in larger groups. for supergroup_name, expiration in expiring_supergroups: add_expiration(self.session, expiration, group_name=supergroup_name, member_name=member_name, recipients=[recipient], member_is_user=False) else: # We're removing an owner, who should no longer find out when this # group they no longer own loses its membership in larger groups. for supergroup_name, _ in expiring_supergroups: cancel_expiration(self.session, group_name=supergroup_name, member_name=member_name, recipients=[recipient])
def apply_changes(self, changes): # type: (Dict[str, Any]) -> None # TODO(cbguder): get around circular dependencies from grouper.models.group import Group for key, value in iteritems(changes): if key == "expiration": group_name = self.group.name if OBJ_TYPES_IDX[self.member_type] == "User": # If affected member is a user, plan to notify that user. user = User.get(self.session, pk=self.member_pk) assert user member_name = user.username recipients = [member_name] member_is_user = True else: # Otherwise, affected member is a group, notify its owners. subgroup = Group.get(self.session, pk=self.member_pk) member_name = subgroup.groupname recipients = subgroup.my_owners_as_strings() member_is_user = False if getattr(self, key, None) is not None: # Check for and remove pending expiration notification. cancel_expiration(self.session, group_name, member_name) if value: expiration = datetime.strptime(value, "%m/%d/%Y") setattr(self, key, expiration) # Avoid sending notifications for expired edges. if expiration > datetime.utcnow(): add_expiration( self.session, expiration, group_name, member_name, recipients=recipients, member_is_user=member_is_user, ) else: setattr(self, key, None) else: setattr(self, key, value)
def apply_changes(self, changes): # type: (Dict[str, Any]) -> None # TODO(cbguder): get around circular dependencies from grouper.models.group import Group for key, value in changes.items(): if key == "expiration": group_name = self.group.name if OBJ_TYPES_IDX[self.member_type] == "User": # If affected member is a user, plan to notify that user. user = User.get(self.session, pk=self.member_pk) assert user member_name = user.username recipients = [member_name] member_is_user = True else: # Otherwise, affected member is a group, notify its owners. subgroup = Group.get(self.session, pk=self.member_pk) member_name = subgroup.groupname recipients = subgroup.my_owners_as_strings() member_is_user = False if getattr(self, key, None) is not None: # Check for and remove pending expiration notification. cancel_expiration(self.session, group_name, member_name) if value: expiration = datetime.strptime(value, "%m/%d/%Y") setattr(self, key, expiration) # Avoid sending notifications for expired edges. if expiration > datetime.utcnow(): add_expiration( self.session, expiration, group_name, member_name, recipients=recipients, member_is_user=member_is_user, ) else: setattr(self, key, None) else: setattr(self, key, value)