async def add_workbook_variation( id: int, variation_path: Optional[str] = None, variation_patch: Optional[schemas.VariationIn] = None, db_workbook: DBWorkbook = Depends(get_current_workbook), db: Session = Depends(get_db), client: AioWrap = Depends(AioWrap)): if variation_patch: variation = { 'vma_sources': variation_patch.vma_sources, 'scenario_vars': variation_patch.scenario_vars, 'reference_vars': variation_patch.reference_vars, 'scenario_parent_path': variation_patch.scenario_parent_path, 'reference_parent_path': variation_patch.reference_parent_path } if variation_path: variation = (await client(variation_path))['data'] # variation.pop('name') validation = await validate_full_schema(variation, client) if not validation['valid']: raise HTTPException(status_code=422, detail=validation['reason']) warnings = validation.get('warnings') db_workbook.variations = db_workbook.variations + [variation] db_workbook.version = db_workbook.version + 1 db_workbook.has_run = False saved_db_workbook = save_workbook(db, db_workbook) response = schemas.WorkbookOut.from_orm(saved_db_workbook) response.warnings = warnings return response
async def initialize(db: Session = Depends(get_db)): if db.query(models.VMA).count() > 0: if settings.is_production: raise HTTPException(status_code=400, detail="Database already initialized") else: clear_all_tables(db) [scenario_json, references_json] = transform() canonical_scenarios = ['drawdown-2020', 'plausible-2020', 'optimum-2020'] for canonical_scenario in canonical_scenarios: scenario = save_entity(db, canonical_scenario, scenario_json, models.Scenario) reference = save_entity(db, canonical_scenario, references_json, models.Reference) variation = models.Variation(name='default', data={ "scenario_parent_path": scenario.path, "reference_parent_path": reference.path, "scenario_vars": {}, "reference_vars": {}, "vma_sources": {} }) save_variation(db, variation) variation_dict = variation.__dict__['data'] workbook = models.Workbook(name=canonical_scenario, description=canonical_scenario + " one of the canonical scenarios.", ui={}, regions=['World'], start_year=2014, end_year=2060, variations=[variation_dict]) db_workbook = save_workbook(db, workbook) # populate resource tables: resource_models = [('vma_data', models.VMA), ('tam', models.TAM), ('ad', models.AdoptionData), ('ca_pds_data', models.CustomAdoptionPDS), ('ca_ref_data', models.CustomAdoptionRef)] for (directory, model) in resource_models: resources = populate(directory) for res in resources: name = f"{res['technology']}/{res['filename']}" save_entity(db, name, res['data'], model) vmas = convert_vmas_to_binary() for vma in vmas: vma_csv = models.VMA_CSV(name=vma['filename'], technology=vma['technology'], variable=vma['path'], legacy_variable=vma['legacy_variable'], original_filename=vma['filename'], data=vma['data']) db.add(vma_csv) db.commit()
async def delete_workbook_variation( id: int, variation_index: int, db_workbook: DBWorkbook = Depends(get_current_workbook), db: Session = Depends(get_db)): db_workbook.variations = without(db_workbook.variations, variation_index) db_workbook.version = db_workbook.version + 1 saved_db_workbook = save_workbook(db, db_workbook) return saved_db_workbook
async def fork_workbook( id: int, db_active_user: DBUser = Depends(get_current_active_user), db: Session = Depends(get_db)): try: cloned_workbook = clone_workbook(db, id) except: raise HTTPException(status_code=400, detail="Workbook not found") cloned_workbook.author_id = db_active_user.id saved_workbook = save_workbook(db, cloned_workbook) return saved_workbook
async def update_workbook( id: int, workbook_edits: schemas.WorkbookPatch, db_workbook: DBWorkbook = Depends(get_current_workbook), db: Session = Depends(get_db), client: AioWrap = Depends(AioWrap)): workbook_edits_dict = dict(workbook_edits) for key in workbook_edits_dict: value = workbook_edits_dict[key] if value is not None: db_workbook.__setattr__(key, value) db_workbook.version = db_workbook.version + 1 db_workbook.has_run = False saved_db_workbook = save_workbook(db, db_workbook) return saved_db_workbook
async def create_workbook( workbook: schemas.WorkbookNew, db_active_user: DBUser = Depends(get_current_active_user), db: Session = Depends(get_db)): dbworkbook = DBWorkbook( name = workbook.name, description = workbook.description, author_id = db_active_user.id, ui = workbook.ui, regions = workbook.regions, start_year = workbook.start_year, end_year = workbook.end_year, variations = [], has_run = False ) saved_workbook = save_workbook(db, dbworkbook) return saved_workbook
async def update_workbook_variation( id: int, variation_index: int, variation_patch: schemas.VariationIn, db_workbook: DBWorkbook = Depends(get_current_workbook), db: Session = Depends(get_db), client: AioWrap = Depends(AioWrap)): # validation = await validate_full_schema(variation_patch, client) # if not validation['valid']: # raise HTTPException(status_code=422, detail=validation['reason']) # warnings = validation.get('warnings') db_workbook.variations = replace(db_workbook.variations, variation_index, variation_patch.__dict__) db_workbook.version = db_workbook.version + 1 db_workbook.has_run = False saved_db_workbook = save_workbook(db, db_workbook) response = schemas.WorkbookOut.from_orm(saved_db_workbook) # response.warnings = warnings return response