예제 #1
0
    def _save_study(
        self,
        study: RawStudy,
        owner: Optional[JWTUser] = None,
        group_ids: List[str] = list(),
        content_status: StudyContentStatus = StudyContentStatus.VALID,
    ) -> None:
        if not owner:
            raise UserHasNotPermissionError

        info = self.study_service.get_study_information(study)["antares"]

        study.name = info["caption"]
        study.version = info["version"]
        study.author = info["author"]
        study.created_at = datetime.fromtimestamp(info["created"])
        study.updated_at = datetime.fromtimestamp(info["lastsave"])
        study.content_status = content_status

        if owner:
            study.owner = User(id=owner.impersonator)
            groups = []
            for gid in group_ids:
                group = next(filter(lambda g: g.id == gid, owner.groups), None)
                if group is None or not group.role.is_higher_or_equals(
                        RoleType.WRITER):
                    raise UserHasNotPermissionError()
                groups.append(Group(id=group.id, name=group.name))
            study.groups = groups

        self.repository.save(study)
예제 #2
0
    def sync_studies_on_disk(self, folders: List[StudyFolder]) -> None:

        # delete orphan studies on database
        paths = [str(f.path) for f in folders]
        for study in self.repository.get_all():
            if isinstance(
                    study,
                    RawStudy) and (study.workspace != DEFAULT_WORKSPACE_NAME
                                   and study.path not in paths):
                logger.info(
                    f"Study={study.id} is not present in disk and will be deleted"
                )
                self.event_bus.push(
                    Event(EventType.STUDY_DELETED, study.to_json_summary()))
                self.repository.delete(study.id)

        # Add new studies
        paths = [
            study.path for study in self.repository.get_all()
            if isinstance(study, RawStudy)
        ]
        for folder in folders:
            if str(folder.path) not in paths:
                study = RawStudy(
                    id=str(uuid4()),
                    name=folder.path.name,
                    path=str(folder.path),
                    workspace=folder.workspace,
                    owner=None,
                    groups=folder.groups,
                    public_mode=PublicMode.FULL
                    if len(folder.groups) == 0 else PublicMode.NONE,
                )

                study.content_status = self._analyse_study(study)

                logger.info(
                    f"Study={study.id} appears on disk and will be added")
                self.event_bus.push(
                    Event(EventType.STUDY_CREATED, study.to_json_summary()))
                self.repository.save(study)