import traceback from sqlalchemy import func from db import db from workers.base_worker import BaseWorker from models.projects import Project, ProjectTargetItem from utils.snowflake.gras_data.protected_projects_importer import ProtectedProjectsImporter from projects.services.projects_service import ProjectsService from constants.labels_constants import TEST_UK_LABEL_ID, TEST_US_LABEL_ID class ConfidentialProjectWorker(BaseWorker): project_service = ProjectsService() def execute(self): self.logger.info("Confidential Projects Checking", "Started") try: self.__confidential_projects_checking() except Exception as error: self.logger.error("Confidential Projects Checking error", f"{error}\n{traceback.format_exc()}") return self.logger.success("Confidential Projects Checking", "Finished") def __confidential_projects_checking(self): gras_ids = [ project.gras_project_external_id for project in ( db.session.query(func.distinct(Project.gras_project_code).label("gras_project_external_id")) .join(ProjectTargetItem, ProjectTargetItem.project_id == Project.id) .filter(Project.label_id.notin_([TEST_UK_LABEL_ID, TEST_US_LABEL_ID])) .all() ) ] result = ProtectedProjectsImporter().fetch(gras_ids=gras_ids) for project in result: self.project_service.process_is_confidential(project) ( db.session.query(Project) .filter(Project.gras_project_code == str(project.external_id)) .update({Project.is_confidential: bool(project.is_confidential)}) ) not_valid_projects = ( db.session.query(Project.id) .outerjoin(ProjectTargetItem, ProjectTargetItem.project_id == Project.id) .filter(ProjectTargetItem.id.is_(None), Project.is_deleted.is_(False)) .subquery() ) db.session.query(Project).filter(not_valid_projects.c.id == Project.id).update({Project.is_deleted: True}) db.session.commit() db.session.close()