Browse Source

Allow creation of dataset from a collection

Matthias Vogelgesang 7 years ago
parent
commit
94cf3f7174
4 changed files with 18 additions and 24 deletions
  1. 2 16
      nova/logic.py
  2. 5 1
      nova/templates/collection/list.html
  3. 1 1
      nova/templates/dataset/create.html
  4. 10 6
      nova/views.py

+ 2 - 16
nova/logic.py

@@ -10,26 +10,12 @@ def create_collection(name, user, description=None):
     return collection
 
 
-def create_dataset(name, user, collection, description=None):
+def create_dataset(dtype, name, user, collection, **kwargs):
     # TODO: merge functionality with import_dataset
     root = app.config['NOVA_ROOT_PATH']
     path = os.path.join(root, user.name, collection.name, name)
 
-    dataset = models.Dataset(name=name, path=path, collection=collection, description=description)
-    abspath = os.path.join(root, path)
-    os.makedirs(abspath)
-
-    access = models.Access(user=user, dataset=dataset, owner=True, writable=True, seen=True)
-    db.session.add_all([dataset, access])
-    db.session.commit()
-    return dataset
-
-
-def create_volume(name, user, collection, slices):
-    root = app.config['NOVA_ROOT_PATH']
-    path = os.path.join(root, user.name, collection.name, name)
-
-    dataset = models.Volume(name=name, path=path, collection=collection, slices=slices)
+    dataset = dtype(name=name, path=path, collection=collection, **kwargs)
     abspath = os.path.join(root, path)
     os.makedirs(abspath)
 

+ 5 - 1
nova/templates/collection/list.html

@@ -31,5 +31,9 @@
   </div>
 </div>
 {% endfor %}
+<div class="row">
+  <div class="col-lg-12">
+    <p><a class="btn btn-primary" href="{{ url_for("create_dataset", collection_name=collection.name) }}">New dataset</a></p>
+  </div>
+</div>
 {% endblock %}
-

+ 1 - 1
nova/templates/dataset/create.html

@@ -10,7 +10,7 @@
 <div class="row">
   <div class="col-lg-6">
     <div class="bs-component">
-      <form class="form-horizontal" method="POST" action="{{ url_for("create") }}">
+      <form class="form-horizontal" method="POST" action="{{ url_for("create_dataset", collection_name=collection.name) }}">
         <fieldset>
           <div class="form-group">
             <label for="inputName" class="col-lg-2 control-label">Name</label>

+ 10 - 6
nova/views.py

@@ -2,7 +2,7 @@ import os
 import io
 import re
 from functools import wraps
-from nova import app, db, login_manager, fs, logic, memtar, tasks
+from nova import app, db, login_manager, fs, logic, memtar, tasks, models
 from nova.models import (User, Collection, Dataset, SampleScan, Genus, Family,
                          Order, Access, Notification, Process)
 from flask import (Response, render_template, request, flash, redirect,
@@ -201,16 +201,20 @@ def profile(name, page=1):
     return render_template('user/profile.html', user=user, pagination=pagination)
 
 
-@app.route('/create', methods=['GET', 'POST'])
+@app.route('/create/<collection_name>', methods=['GET', 'POST'])
 @login_required(admin=False)
-def create():
+def create_dataset(collection_name):
     form = CreateForm()
+    collection = Collection.query.\
+        filter(Collection.name == collection_name).\
+        filter(Collection.user == current_user).\
+        first()
 
     if form.validate_on_submit():
-        logic.create_dataset(form.name.data, current_user, form.description.data)
+        logic.create_dataset(models.SampleScan, form.name.data, current_user, collection, form.description.data)
         return redirect(url_for('index'))
 
-    return render_template('dataset/create.html', form=form)
+    return render_template('dataset/create.html', form=form, collection=collection)
 
 
 @app.route('/foo', methods=['GET', 'POST'])
@@ -393,7 +397,7 @@ def share(dataset_id, user_id=None):
 @login_required(admin=False)
 def process(dataset_id):
     parent = Dataset.query.filter(Dataset.id == dataset_id).first()
-    child = logic.create_volume(request.form['name'], current_user, parent.collection, request.form['outname'])
+    child = logic.create_dataset(models.Volume, request.form['name'], current_user, parent.collection, slices=request.form['outname'])
     db.session.add(Process(source=parent, destination=child))
 
     tasks.reconstruct.delay(current_user.token, child.id, parent.id,