def delete(self, team_id):
     """
     Deletes a Team
     ---
     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: The unique team ID
           required: true
           type: integer
           default: 1
     responses:
         200:
             description: Team deleted
         401:
             description: Unauthorized - Invalid credentials
         403:
             description: Forbidden - Team has associated projects
         404:
             description: Team not found
         500:
             description: Internal Server Error
     """
     if not TeamService.user_is_manager(team_id, token_auth.current_user()):
         return {"Error": "User is not a manager for the team"}, 401
     try:
         TeamService.delete_team(team_id)
         return {"Success": "Team deleted"}, 200
     except NotFound:
         return {"Error": "Team Not Found"}, 404
     except Exception as e:
         error_msg = f"Team DELETE - unhandled error: {str(e)}"
         current_app.logger.critical(error_msg)
         return {"Error": error_msg}, 500
Exemple #2
0
 def delete(self, team_id, project_id):
     """
     Deletes the specified team project assignment
     ---
     tags:
       - teams
     produces:
       - application/json
     parameters:
         - in: header
           name: Authorization
           description: Base64 encoded session token
           required: true
           type: string
           default: Token sessionTokenHere==
         - name: message_id
           in: path
           description: Unique message ID
           required: true
           type: integer
           default: 1
     responses:
         200:
             description: Team unassigned of the project
         401:
             description: Forbidden, if user is not a manager of the project
         403:
             description: Forbidden, if user is not authenticated
         404:
             description: Not found
         500:
             description: Internal Server Error
     """
     if not TeamService.user_is_manager(team_id, token_auth.current_user()):
         return {"Error": "User is not an admin or a manager for the team"}, 401
     try:
         TeamService.delete_team_project(team_id, project_id)
         return {"Success": True}, 200
     except NotFound:
         return {"Error": "No team found"}, 404
     except Exception as e:
         error_msg = f"TeamMembers DELETE - unhandled error: {str(e)}"
         current_app.logger.critical(error_msg)
         return {"Error": error_msg}, 500
    def post(self, team_id):
        """
        Updates a team information
        ---
        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 updating a team
              schema:
                properties:
                    name:
                        type: string
                        default: HOT - Mappers
                    logo:
                        type: string
                        default: https://tasks.hotosm.org/assets/img/hot-tm-logo.svg
                    members:
                        type: array
                        items:
                            schema:
                                $ref: "#/definitions/TeamMembers"
                    organisation:
                        type: string
                        default: HOT
                    description:
                        type: string
                        default: HOT's mapping editors
                    inviteOnly:
                        type: boolean
                        default: false
        responses:
            201:
                description: Team updated successfully
            400:
                description: Client Error - Invalid Request
            401:
                description: Unauthorized - Invalid credentials
            500:
                description: Internal Server Error
        """
        try:
            team_dto = TeamDTO(request.get_json())
            team_dto.team_id = team_id
            team_dto.validate()

            authenticated_user_id = token_auth.current_user()
            team_details_dto = TeamService.get_team_as_dto(
                team_id, authenticated_user_id)

            org = TeamService.assert_validate_organisation(
                team_dto.organisation_id)
            TeamService.assert_validate_members(team_details_dto)

            if not TeamService.user_is_manager(
                    team_id, authenticated_user_id
            ) and not OrganisationService.can_user_manage_organisation(
                    org.id, authenticated_user_id):
                return {
                    "Error": "User is not a admin or a manager for the team"
                }, 401
        except DataError as e:
            current_app.logger.error(f"error validating request: {str(e)}")
            return str(e), 400

        try:
            TeamService.update_team(team_dto)
            return {"Status": "Updated"}, 200
        except NotFound as e:
            return {"Error": str(e)}, 404
        except TeamServiceError as e:
            return str(e), 402
        except Exception as e:
            error_msg = f"Team POST - unhandled error: {str(e)}"
            current_app.logger.critical(error_msg)
            return {"Error": error_msg}, 500
Exemple #4
0
    def post(self, team_id, project_id):
        """ Assign a team to a project
        ---
        tags:
          - teams
        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
            - name: team_id
              in: path
              description: Unique team ID
              required: true
              type: integer
              default: 1
            - in: body
              name: body
              required: true
              description: The role that the team will have on the project
              schema:
                  properties:
                      role:
                        type: string
        responses:
            201:
                description: Team project assignment created
            401:
                description: Forbidden, if user is not a manager of the project
            403:
                description: Forbidden, if user is not authenticated
            404:
                description: Not found
            500:
                description: Internal Server Error
        """
        if not TeamService.user_is_manager(team_id, token_auth.current_user()):
            return {"Error": "User is not an admin or a manager for the team"}, 401

        try:
            role = request.get_json(force=True)["role"]
        except DataError as e:
            current_app.logger.error(f"Error validating request: {str(e)}")
            return str(e), 400

        try:
            TeamService.add_team_project(team_id, project_id, role)
            return (
                {
                    "Success": "Team {} assigned to project {} with role {}".format(
                        team_id, project_id, role
                    )
                },
                201,
            )
        except Exception as e:
            error_msg = f"Project Team POST - unhandled error: {str(e)}"
            current_app.logger.critical(error_msg)
            return {"Error": error_msg}, 500
Exemple #5
0
    def patch(self, team_id):
        """
        Take action on a team invite
        ---
        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 to accept or reject a request to join team
              schema:
                properties:
                    username:
                        type: string
                        required: true
                    type:
                        type: string
                        default: join-response
                        required: true
                    role:
                        type: string
                        default: member
                        required: false
                    action:
                        type: string
                        default: accept
                        required: true
        responses:
            200:
                description: Member added
            403:
                description: Forbidden
            404:
                description: Not found
            500:
                description: Internal Server Error
        """
        try:
            json_data = request.get_json(force=True)
            username = json_data["username"]
            request_type = json_data.get("type", "join-response")
            action = json_data["action"]
            role = json_data.get("role", "member")
        except DataError as e:
            current_app.logger.error(f"error validating request: {str(e)}")
            return str(e), 400

        try:
            authenticated_user_id = token_auth.current_user()
            if request_type == "join-response":
                if TeamService.user_is_manager(team_id, authenticated_user_id):
                    TeamService.accept_reject_join_request(
                        team_id, authenticated_user_id, username, role, action
                    )
                    return {"Success": "True"}, 200
                else:
                    return (
                        {
                            "Error": "You don't have permissions to approve this join team request"
                        },
                        403,
                    )
            elif request_type == "invite-response":
                TeamService.accept_reject_invitation_request(
                    team_id, authenticated_user_id, username, role, action
                )
                return {"Success": "True"}, 200
        except Exception as e:
            raise
            error_msg = f"Team Join PUT - unhandled error: {str(e)}"
            current_app.logger.critical(error_msg)
            return {"Error": error_msg}, 500
Exemple #6
0
 def post(self, team_id):
     """
     Removes a user from a team
     ---
     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 to remove user from team
           schema:
             properties:
                 username:
                     type: string
                     default: 1
                     required: true
     responses:
         200:
             description: Member deleted
         403:
             description: Forbidden, if user attempting to ready other messages
         404:
             description: Not found
         500:
             description: Internal Server Error
     """
     try:
         authenticated_user_id = token_auth.current_user()
         username = request.get_json(force=True)["username"]
         request_user = User.get_by_id(authenticated_user_id)
         if (
             TeamService.user_is_manager(team_id, authenticated_user_id)
             or request_user.username == username
         ):
             TeamService.leave_team(team_id, username)
             return {"Success": "User removed from the team"}, 200
         else:
             return (
                 {
                     "Error": "You don't have permissions to remove {} from this team.".format(
                         username
                     )
                 },
                 403,
             )
     except NotFound:
         return {"Error": "No team member found"}, 404
     except Exception as e:
         error_msg = f"TeamMembers DELETE - unhandled error: {str(e)}"
         current_app.logger.critical(error_msg)
         return {"Error": error_msg}, 500
Exemple #7
0
    def post(self, team_id):
        """
        Request to join a team
        ---
        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 to join team
              schema:
                properties:
                    username:
                        type: string
                        required: true
                    role:
                        type: string
                        required: false
        responses:
            200:
                description: Member added
            403:
                description: Forbidden
            404:
                description: Not found
            500:
                description: Internal Server Error
        """
        try:
            post_data = request.get_json(force=True)
            username = post_data["username"]
            role = post_data.get("role", None)
        except (DataError, KeyError) as e:
            current_app.logger.error(f"error validating request: {str(e)}")
            return str(e), 400

        try:
            authenticated_user_id = token_auth.current_user()
            TeamService.join_team(team_id, authenticated_user_id, username, role)
            if TeamService.user_is_manager(team_id, authenticated_user_id):
                return {"Success": "User added to the team"}, 200
            else:
                return {"Success": "Request to join the team sent successfully."}, 200
        except TeamJoinNotAllowed as e:
            return {"Error": str(e)}, 403
        except Exception as e:
            error_msg = f"User POST - unhandled error: {str(e)}"
            current_app.logger.critical(error_msg)
            return {"Error": error_msg}, 500
Exemple #8
0
    def patch(self, team_id, project_id):
        """ Update role of a team on a project
        ---
        tags:
          - teams
        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
            - name: team_id
              in: path
              description: Unique team ID
              required: true
              type: integer
              default: 1
            - in: body
              name: body
              required: true
              description: The role that the team will have on the project
              schema:
                  properties:
                      role:
                        type: string
        responses:
            201:
                description: Team project assignment created
            401:
                description: Forbidden, if user is not a manager of the project
            403:
                description: Forbidden, if user is not authenticated
            404:
                description: Not found
            500:
                description: Internal Server Error
        """
        if not TeamService.user_is_manager(team_id, tm.authenticated_user_id):
            return {"Error": "User is not an admin or a manager for the team"}, 401
        try:
            role = request.get_json(force=True)["role"]
        except DataError as e:
            current_app.logger.error(f"Error validating request: {str(e)}")
            return str(e), 400

        try:
            TeamService.change_team_role(team_id, project_id, role)
            return {"Status": "Team role updated successfully."}, 200
        except NotFound as e:
            return {"Error": str(e)}, 404
        except TeamServiceError as e:
            return str(e), 402
        except Exception as e:
            error_msg = f"Team-Project PATCH - unhandled error: {str(e)}"
            current_app.logger.critical(error_msg)
            return {"Error": error_msg}, 500