def test_get_project_dto_for_mapping_raises_error_if_project_not_published(
            self, mock_project):
        # Arrange
        test_project = Project()
        test_project.status = ProjectStatus.DRAFT.value
        mock_project.return_value = test_project

        # Act / Assert
        with self.assertRaises(ProjectServiceError):
            ProjectService.get_project_dto_for_mapper(123, 'en')
示例#2
0
 def get(self, project_id):
     """
     Get HOT Project for mapping
     ---
     tags:
         - mapping
     produces:
         - application/json
     parameters:
         - in: header
           name: Accept-Language
           description: Language user is requesting
           type: string
           required: true
           default: en
         - name: project_id
           in: path
           description: The unique project ID
           required: true
           type: integer
           default: 1
     responses:
         200:
             description: Project found
         403:
             description: Forbidden
         404:
             description: Project not found
         500:
             description: Internal Server Error
     """
     try:
         project_dto = ProjectService.get_project_dto_for_mapper(project_id,
                                                                 request.environ.get('HTTP_ACCEPT_LANGUAGE'))
         return project_dto.to_primitive(), 200
     except NotFound:
         return {"Error": "Project Not Found"}, 404
     except ProjectServiceError as e:
         return {"error": str(e)}, 403
     except Exception as e:
         error_msg = f'Project GET - unhandled error: {str(e)}'
         current_app.logger.critical(error_msg)
         return {"error": error_msg}, 500
     finally:
         # this will try to unlock tasks older than 2 hours
         try:
             ProjectService.auto_unlock_tasks(project_id)
         except Exception as e:
             current_app.logger.critical(str(e))
示例#3
0
    def get(self, project_id):
        """
        Get HOT Project for mapping
        ---
        tags:
            - mapping
        produces:
            - application/json
        parameters:
            - in: header
              name: Accept-Language
              description: Language user is requesting
              type: string
              required: true
              default: en
            - name: project_id
              in: path
              description: The unique project ID
              required: true
              type: integer
              default: 1
            - in: query
              name: as_file
              type: boolean
              description: Set to true if file download is preferred
              default: False
            - in: query
              name: abbreviated
              type: boolean
              description: Set to true if only state information is desired
              default: False
        responses:
            200:
                description: Project found
            403:
                description: Forbidden
            404:
                description: Project not found
            500:
                description: Internal Server Error
        """
        try:
            as_file = strtobool(request.args.get(
                'as_file')) if request.args.get('as_file') else False
            abbreviated = strtobool(request.args.get(
                'abbreviated')) if request.args.get('abbreviated') else False

            project_dto = ProjectService.get_project_dto_for_mapper(
                project_id, request.environ.get('HTTP_ACCEPT_LANGUAGE'),
                abbreviated)
            project_dto = project_dto.to_primitive()

            if as_file:
                return send_file(
                    io.BytesIO(geojson.dumps(project_dto).encode('utf-8')),
                    mimetype='application/json',
                    as_attachment=True,
                    attachment_filename=f'project_{str(project_id)}.json')

            return project_dto, 200
        except NotFound:
            return {"Error": "Project Not Found"}, 404
        except ProjectServiceError as e:
            return {"error": str(e)}, 403
        except Exception as e:
            error_msg = f'Project GET - unhandled error: {str(e)}'
            current_app.logger.critical(error_msg)
            return {"error": error_msg}, 500
        finally:
            # this will try to unlock tasks that have been locked too long
            try:
                ProjectService.auto_unlock_tasks(project_id)
            except Exception as e:
                current_app.logger.critical(str(e))