def build_participants_for_reply(self, user): """ build participants list from last message in discussion. - former 'From' recipients are replaced by 'To' recipients - provided identity is used to fill the new 'From' participant - new sender is removed from former recipients """ dim = DIM(user) d_id = self.discussion_id last_message = dim.get_last_message(d_id, -10, 10, False) for i, participant in enumerate(last_message["participants"]): if re.match("from", participant['type'], re.IGNORECASE): participant["type"] = "To" self.participants.append(participant) else: self.participants.append(participant) # add sender # and remove it from previous recipients sender = self._add_from_participant(user) for i, participant in enumerate(self.participants): if participant['address'] == sender.address: if re.match("to", participant['type'], re.IGNORECASE) or \ re.match("cc", participant['type'], re.IGNORECASE) or \ re.match("bcc", participant['type'], re.IGNORECASE): self.participants.pop(i)
def _build_participants_for_reply(self, user): """ Build participants list from last message in discussion. - former 'From' recipients are replaced by 'To' recipients - provided identity is used to fill the new 'From' participant - new sender is removed from former recipients """ if not self.discussion_id: return dim = DIM(user) d_id = self.discussion_id last_message = dim.get_last_message(d_id, -10, 10, False) for i, participant in enumerate(last_message["participants"]): if re.match("from", participant['type'], re.IGNORECASE): participant["type"] = "To" self.participants.append(participant) else: self.participants.append(participant) # add sender # and remove it from previous recipients sender = self._add_from_participant(user) for i, participant in enumerate(self.participants): if participant['address'] == sender.address: if re.match("to", participant['type'], re.IGNORECASE) or \ re.match("cc", participant['type'], re.IGNORECASE) or \ re.match("bcc", participant['type'], re.IGNORECASE): self.participants.pop(i)
def _check_discussion_consistency(self, user): from caliopen_main.message.objects.message import Message new_discussion = False if not hasattr(self, 'discussion_id') or self.discussion_id == "" \ or self.discussion_id is None: # no discussion_id provided. Try to find one with draft's parent_id # or create new discussion if hasattr(self, 'parent_id') \ and self.parent_id is not None \ and self.parent_id != "": parent_msg = Message(user, message_id=self.parent_id) try: parent_msg.get_db() parent_msg.unmarshall_db() except NotFound: raise err.PatchError(message="parent message not found") self.discussion_id = parent_msg.discussion_id else: discussion = Discussion.create_from_message(user, self) self.discussion_id = discussion.discussion_id new_discussion = True if not new_discussion: dim = DIM(user) d_id = self.discussion_id last_message = dim.get_last_message(d_id, -10, 10, True) if last_message == {}: raise err.PatchError( message='No such discussion {}'.format(d_id)) is_a_reply = (str(last_message.message_id) != str(self.message_id)) if is_a_reply: # check participants consistency if hasattr(self, "participants") and len(self.participants) > 0: participants = [p['address'] for p in self.participants] last_msg_participants = [ p['address'] for p in last_message.participants ] if len(participants) != len(last_msg_participants): raise err.PatchError( message="list of participants " "is not consistent for this discussion") participants.sort() last_msg_participants.sort() for i, participant in enumerate(participants): if participant != last_msg_participants[i]: raise err.PatchConflict( message="list of participants " "is not consistent for this discussion") else: self.build_participants_for_reply(user) # check parent_id consistency if 'parent_id' in self and self.parent_id != "" \ and self.parent_id is not None: if not dim.message_belongs_to( discussion_id=self.discussion_id, message_id=self.parent_id): raise err.PatchConflict(message="provided message " "parent_id does not belong " "to this discussion") else: self.parent_id = last_message.parent_id self.update_external_references(user) else: last_message = None else: last_message = None return last_message