def test_published_project_with_incomplete_default_locale_raises_error( self, mock_project, mock_user): # Arrange stub_project = Project() stub_project.status = ProjectStatus.PUBLISHED.value mock_project.return_value = stub_project locales = [] info = ProjectInfoDTO() info.locale = "en" info.name = "Test" locales.append(info) dto = ProjectDTO() dto.project_id = 1 dto.default_locale = "en" dto.project_info_locales = locales dto.project_status = ProjectStatus.PUBLISHED.name stub_admin_user = User() stub_admin_user.username = "******" stub_admin_user.role = UserRole.ADMIN.value mock_user.return_value = stub_admin_user # Act / Assert with self.assertRaises(ProjectAdminServiceError): ProjectAdminService.update_project(dto, mock_user.id)
def test_updating_a_private_project_with_no_allowed_users_causes_an_error( self, mock_project, mock_user): # Arrange mock_project.return_value = Project() dto = ProjectDTO() dto.private = True dto.allowed_usernames = [] stub_user = User() stub_user.username = "******" stub_user.role = UserRole.ADMIN.value mock_user.return_value = stub_user with self.assertRaises(ProjectAdminServiceError): ProjectAdminService.update_project(dto, mock_user.id)
def test_updating_a_project_with_different_roles(self, mock_project, mock_project2, mock_user): stub_project = Project() stub_project.status = ProjectStatus.DRAFT.value mock_project.return_value = stub_project locales = [] info = ProjectInfoDTO() info.locale = "en" info.name = "Test" locales.append(info) dto = ProjectDTO() dto.project_id = 1 dto.default_locale = "en" dto.project_status = ProjectStatus.DRAFT.name dto.project_priority = ProjectPriority.LOW.name dto.mapper_level = MappingLevel.BEGINNER.name dto.mapping_types = ["ROADS"] dto.mapping_editors = ["ID"] dto.validation_editors = ["ID"] dto.project_info_locales = locales stub_user = User() stub_user.username = "******" stub_user.role = UserRole.MAPPER.value mock_user.return_value = stub_user with self.assertRaises(ValueError) as e: ProjectAdminService.update_project(dto, mock_user.id) the_exception = e.exception self.assertTrue(isinstance(the_exception, ValueError)) # stub_project.author_id = mock_user.id stub_user.username = "******" stub_user.role = UserRole.ADMIN.value mock_user.return_value = stub_user try: ProjectAdminService.update_project(dto, mock_user.id) except ProjectAdminServiceError: self.fail("update_project raised an exception with admin role")
def test_updating_a_private_project_with_no_allowed_users( self, mock_project, mock_project2, mock_user): # Arrange mock_project.return_value = Project() dto = ProjectDTO() dto.private = True dto.allowed_usernames = [] stub_user = User() stub_user.username = "******" stub_user.role = UserRole.ADMIN.value mock_user.return_value = stub_user try: ProjectAdminService.update_project(dto, mock_user.id) except ProjectAdminServiceError: self.fail( "update_project raised an exception when setting it as private" )
def patch(self, project_id): """ Updates a Tasking-Manager 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 updating an existing project schema: properties: projectStatus: type: string default: DRAFT projectPriority: type: string default: MEDIUM defaultLocale: type: string default: en mapperLevel: type: string default: BEGINNER validation_permission: type: string default: ANY mapping_permission: type: string default: ANY private: type: boolean default: false changesetComment: type: string default: hotosm-project-1 dueDate: type: date default: "2017-04-11T12:38:49" imagery: type: string default: http//www.bing.com/maps/ josmPreset: type: string default: josm preset goes here mappingTypes: type: array items: type: string default: [BUILDINGS, ROADS] mappingEditors: type: array items: type: string default: [ID, JOSM, POTLATCH_2, FIELD_PAPERS] validationEditors: type: array items: type: string default: [ID, JOSM, POTLATCH_2, FIELD_PAPERS] campaign: type: string default: malaria organisation: type: integer default: 1 countryTag: type: array items: type: string default: [] licenseId: type: integer default: 1 description: Id of imagery license associated with the project allowedUsernames: type: array items: type: string default: ["Iain Hunter", LindaA1] priorityAreas: type: array items: schema: $ref: "#/definitions/GeoJsonPolygon" projectInfoLocales: type: array items: schema: $ref: "#/definitions/ProjectInfo" taskCreationMode: type: integer default: GRID responses: 200: description: Project updated 400: description: Client Error - Invalid Request 401: description: Unauthorized - Invalid credentials 403: description: Forbidden 404: description: Project not found 500: description: Internal Server Error """ authenticated_user_id = token_auth.current_user() try: ProjectAdminService.is_user_action_permitted_on_project( authenticated_user_id, project_id ) except ValueError as e: error_msg = f"ProjectsRestAPI PATCH: {str(e)}" return {"Error": error_msg}, 403 try: project_dto = ProjectDTO(request.get_json()) project_dto.project_id = project_id project_dto.validate() except DataError as e: current_app.logger.error(f"Error validating request: {str(e)}") return {"Error": "Unable to update project"}, 400 try: ProjectAdminService.update_project(project_dto, authenticated_user_id) return {"Status": "Updated"}, 200 except InvalidGeoJson as e: return {"Invalid GeoJson": str(e)}, 400 except NotFound as e: return {"Error": str(e) or "Project Not Found"}, 404 except Exception as e: error_msg = f"ProjectsRestAPI PATCH - unhandled error: {str(e)}" current_app.logger.critical(error_msg) return {"Error": "Unable to update project"}, 500