84 lines
3 KiB
Python
84 lines
3 KiB
Python
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
|