import sqlite3 import datalad.api as dl import datalad.config as dlc import os from .git_tools import move_submodule import shutil def create_project(path, uuid, aliases=None, code=None): """ Create a new project entry in the database. Parameters ---------- path: str The path to the backlogger folder. uuid: str The uuid of the project. name: str (optional) Costum name for the project (e.g. 'cA determination on exponential clover'). code: str (optional) The code that was used to create the measurements. """ conn = sqlite3.connect(path + "/backlogger.db") c = conn.cursor() known_projects = c.execute("SELECT * FROM projects WHERE id=?", (uuid,)) if known_projects.fetchone(): raise ValueError("Project already imported, use update_project() instead.") dl.unlock(path + "/backlogger.db", dataset=path) c.execute("INSERT INTO projects (id, aliases, code, created_at, updated_at) VALUES (?, ?, ?, datetime('now'), datetime('now'))", (uuid, aliases, code)) conn.commit() conn.close() dl.save(path + "/backlogger.db", message="Added entry for project " + uuid + " to database", dataset=path) def import_project(path, url, aliases=None, code=None, isDataset=True): """ Parameters ---------- url: str The url of the project to import. This can be any url that datalad can handle. path: str The path to the backlogger folder. aliases: list[str] Custom name of the project, alias of the project. code: str Code that was used to create the measurements. Import a datalad dataset into the backlogger. Parameters ---------- path: str The path to the backlogger directory. url: str The url of the project to import. This can be any url that datalad can handle. Also supported are non-datalad datasets, which will be converted to datalad datasets, in order to receive a uuid and have a consistent interface. """ tmp_path = path + '/projects/tmp' if not isDataset: dl.create(path + '/projects/tmp', dataset=path) shutil.copytree(url + "/*", path + '/projects/tmp/') dl.save(path + '/projects/tmp', dataset=path) else: dl.install(path=tmp_path, source=url, dataset=path) tmp_ds = dl.Dataset(tmp_path) conf = dlc.ConfigManager(tmp_ds) uuid = conf.get("datalad.dataset.id") if not uuid: raise ValueError("The dataset does not have a uuid!") if not os.path.exists(path + "/projects/" + uuid): dl.unlock(path + "/backlogger.db", dataset=path) create_project(path, uuid, aliases, code) move_submodule(path, 'projects/tmp', 'projects/' + uuid) os.mkdir(path + '/import_scripts/' + uuid) dl.save([path + "/backlogger.db", 'projects/' + uuid], message="Import project from " + url, dataset=path) else: print("Project is already imported.") # make this more concrete return uuid