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)
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)