def send_message_to_all_team_members(team_id: int, team_name: str, message_dto: MessageDTO): """Sends supplied message to all contributors in a team. Message all team members can take over a minute to run, so this method is expected to be called on its own thread""" app = ( create_app() ) # Because message-all run on background thread it needs it's own app context with app.app_context(): team_members = TeamService._get_active_team_members(team_id) sender = UserService.get_user_by_id( message_dto.from_user_id).username message_dto.message = ( "A message from {}, manager of {} team:<br/><br/>{}".format( MessageService.get_user_profile_link(sender), MessageService.get_team_link(team_name, team_id, False), markdown(message_dto.message, output_format="html"), )) messages = [] for team_member in team_members: if team_member.user_id != message_dto.from_user_id: message = Message.from_dto(team_member.user_id, message_dto) message.message_type = MessageType.TEAM_BROADCAST.value message.save() user = UserService.get_user_by_id(team_member.user_id) messages.append(dict(message=message, user=user)) MessageService._push_messages(messages)
def send_message_to_all_contributors(project_id: int, message_dto: MessageDTO): """Sends supplied message to all contributors on specified project. Message all contributors can take over a minute to run, so this method is expected to be called on its own thread""" app = ( create_app() ) # Because message-all run on background thread it needs it's own app context with app.app_context(): contributors = Message.get_all_contributors(project_id) message_dto.message = "A message from {} managers:<br/><br/>{}".format( MessageService.get_project_link(project_id), markdown(message_dto.message, output_format="html"), ) messages = [] for contributor in contributors: message = Message.from_dto(contributor[0], message_dto) message.message_type = MessageType.BROADCAST.value message.project_id = project_id user = UserService.get_user_by_id(contributor[0]) messages.append(dict(message=message, user=user)) MessageService._push_messages(messages)
def send_message_to_all_contributors(project_id: int, message_dto: MessageDTO): """ Sends supplied message to all contributors on specified project. Message all contributors can take over a minute to run, so this method is expected to be called on its own thread """ app = ( create_app() ) # Because message-all run on background thread it needs it's own app context with app.app_context(): contributors = Message.get_all_contributors(project_id) project_link = MessageService.get_project_link(project_id) message_dto.message = ( f"{project_link}<br/><br/>" + message_dto.message ) # Append project link to end of message messages = [] for contributor in contributors: message = Message.from_dto(contributor[0], message_dto) message.message_type = MessageType.BROADCAST.value message.project_id = project_id message.save() user = UserService.get_user_by_id(contributor[0]) messages.append(dict(message=message, user=user)) MessageService._push_messages(messages)
def post(self, project_id): """ Send message to all contributors of a project --- tags: - projects produces: - application/json parameters: - in: header name: Authorization description: Base64 encoded session token required: true type: string default: Token sessionTokenHere== - name: project_id in: path description: Unique project ID required: true type: integer default: 1 - in: body name: body required: true description: JSON object for creating draft project schema: properties: subject: type: string default: Thanks required: true message: type: string default: Thanks for your contribution required: true responses: 200: description: Message sent successfully 401: description: Unauthorized - Invalid credentials 403: description: Forbidden 500: description: Internal Server Error """ try: authenticated_user_id = token_auth.current_user() message_dto = MessageDTO(request.get_json()) message_dto.from_user_id = authenticated_user_id message_dto.validate() except DataError as e: current_app.logger.error(f"Error validating request: {str(e)}") return {"Error": "Unable to send message to mappers"}, 400 try: ProjectAdminService.is_user_action_permitted_on_project( authenticated_user_id, project_id) threading.Thread( target=MessageService.send_message_to_all_contributors, args=(project_id, message_dto), ).start() return {"Success": "Messages started"}, 200 except ValueError as e: return {"Error": str(e)}, 403 except Exception as e: error_msg = f"Send message all - unhandled error: {str(e)}" current_app.logger.critical(error_msg) return {"Error": "Unable to send messages to mappers"}, 500
def as_dto(self) -> MessageDTO: """ Casts message object to DTO """ dto = MessageDTO() dto.message_id = self.id dto.message = self.message dto.sent_date = self.date dto.read = self.read dto.subject = self.subject dto.project_id = self.project_id dto.task_id = self.task_id if self.message_type is not None: dto.message_type = MessageType(self.message_type).name if self.from_user_id: dto.from_username = self.from_user.username return dto
def post(self, team_id): """ Message all team members --- tags: - teams produces: - application/json parameters: - in: header name: Authorization description: Base64 encoded session token required: true type: string default: Token sessionTokenHere== - name: team_id in: path description: Unique team ID required: true type: integer default: 1 - in: body name: body required: true description: JSON object for creating message schema: properties: subject: type: string default: Thanks required: true message: type: string default: Thanks for your contribution required: true responses: 200: description: Message sent successfully 401: description: Unauthorized - Invalid credentials 403: description: Forbidden 500: description: Internal Server Error """ try: authenticated_user_id = token_auth.current_user() team_id = request.view_args["team_id"] message_dto = MessageDTO(request.get_json()) # Validate if team is present try: team = TeamService.get_team_by_id(team_id) except NotFound: return {"Error": "Team not found"}, 404 is_manager = TeamService.is_user_team_manager( team_id, authenticated_user_id) if not is_manager: raise ValueError message_dto.from_user_id = authenticated_user_id message_dto.validate() if not message_dto.message.strip( ) or not message_dto.subject.strip(): raise DataError({"Validation": "Empty message not allowed"}) except DataError as e: current_app.logger.error(f"Error validating request: {str(e)}") return {"Error": "Request payload did not match validation"}, 400 except ValueError: return { "Error": "Unauthorised to send message to team members" }, 403 try: threading.Thread( target=TeamService.send_message_to_all_team_members, args=(team_id, team.name, message_dto), ).start() return {"Success": "Message sent successfully"}, 200 except ValueError as e: return {"Error": str(e)}, 403 except Exception as e: error_msg = f"Send message all - unhandled error: {str(e)}" current_app.logger.critical(error_msg) return {"Error": "Unable to send messages to team members"}, 500