Source code for quizApp.views.datasets
"""Views for CRUD datasets.
"""
import os
from werkzeug.datastructures import CombinedMultiDict
from flask import Blueprint, render_template, url_for, abort, \
request
from flask_security import roles_required
from quizApp.forms.common import DeleteObjectForm, ObjectTypeForm
from quizApp.forms.datasets import DatasetForm, GraphForm, TextForm
from quizApp.models import Dataset, MediaItem
from quizApp.views.helpers import validate_model_id
from quizApp.views.common import ObjectCollectionView, ObjectView
datasets = Blueprint("datasets", __name__, url_prefix="/datasets")
MEDIA_ITEM_TYPES = {
"graph": "Graph",
"text": "Text",
}
DATASET_ROUTE = "/<int:dataset_id>"
MEDIA_ITEMS_ROUTE = os.path.join(DATASET_ROUTE + "/media_items/")
MEDIA_ITEM_ROUTE = os.path.join(MEDIA_ITEMS_ROUTE + "<int:media_item_id>")
[docs]class DatasetCollectionView(ObjectCollectionView):
"""View for managing a collection of Datasets.
"""
decorators = [roles_required("experimenter")]
methods = ["GET", "POST"]
resolve_kwargs = dict
template = "datasets/read_datasets.html"
[docs] def create_member(self, create_form):
dataset = Dataset()
create_form.populate_obj(dataset)
dataset.save()
return {"next_url": url_for("datasets.settings_dataset",
dataset_id=dataset.id)}
datasets.add_url_rule("/",
view_func=DatasetCollectionView.as_view('datasets'))
[docs]class DatasetView(ObjectView):
"""View for handling a particular dataset.
"""
methods = ["PUT", "DELETE"]
object_key = "dataset"
[docs] def resolve_kwargs(self, dataset_id):
return {"dataset": validate_model_id(Dataset, dataset_id)}
datasets.add_url_rule(DATASET_ROUTE,
view_func=DatasetView.as_view('dataset'))
[docs]class MediaItemView(ObjectView):
"""View for handling a particular media item
"""
methods = ["DELETE", "PUT", "GET"]
object_key = "media_item"
template = "datasets/read_media_item.html"
[docs] def update_form(self, media_item, **_):
update_form_mapping = {
"graph": GraphForm(CombinedMultiDict((request.form,
request.files))),
"text": TextForm(request.form),
}
return update_form_mapping[media_item.type]
[docs] def collection_url(self, dataset, **_):
return url_for("datasets.settings_dataset", dataset_id=dataset.id)
[docs] def resolve_kwargs(self, dataset_id, media_item_id):
dataset = validate_model_id(Dataset, dataset_id)
media_item = validate_model_id(MediaItem, media_item_id)
if media_item.dataset != dataset:
abort(404)
return {"dataset": dataset, "media_item": media_item}
datasets.add_url_rule(MEDIA_ITEM_ROUTE,
view_func=MediaItemView.as_view('media_item'))
@datasets.route(DATASET_ROUTE + '/settings', methods=["GET"])
@roles_required("experimenter")
[docs]def settings_dataset(dataset_id):
"""View the configuration of a particular dataset.
"""
dataset = validate_model_id(Dataset, dataset_id)
update_dataset_form = DatasetForm(obj=dataset)
create_media_item_form = ObjectTypeForm()
create_media_item_form.populate_object_type(MEDIA_ITEM_TYPES)
confirm_delete_media_item_form = DeleteObjectForm()
return render_template(
"datasets/settings_dataset.html",
dataset=dataset,
update_dataset_form=update_dataset_form,
confirm_delete_media_item_form=confirm_delete_media_item_form,
create_media_item_form=create_media_item_form)
[docs]class MediaItemCollectionView(ObjectCollectionView):
"""Manage a collection of MediaItems.
"""
decorators = [roles_required("experimenter")]
methods = ["POST"]
get_members = None
template = None
[docs] def resolve_kwargs(self, dataset_id):
dataset = validate_model_id(Dataset, dataset_id)
return {"dataset": dataset}
[docs] def create_form(self):
create_media_item_form = ObjectTypeForm()
create_media_item_form.populate_object_type(MEDIA_ITEM_TYPES)
return create_media_item_form
[docs] def create_member(self, create_form, dataset):
media_item = MediaItem(type=create_form.object_type.data,
dataset=dataset)
media_item.save()
return {
"next_url": url_for("datasets.settings_media_item",
dataset_id=dataset.id,
media_item_id=media_item.id),
}
datasets.add_url_rule(MEDIA_ITEMS_ROUTE,
view_func=MediaItemCollectionView.as_view('media_items'))
@datasets.route(MEDIA_ITEM_ROUTE + "/settings", methods=["GET"])
@roles_required("experimenter")
[docs]def settings_media_item(dataset_id, media_item_id):
"""View the configuration of some media item.
Ultimately this view dispatches to another view for the specific type
of media item.
"""
dataset = validate_model_id(Dataset, dataset_id)
media_item = validate_model_id(MediaItem, media_item_id)
create_media_item_form = ObjectTypeForm()
create_media_item_form.populate_object_type(MEDIA_ITEM_TYPES)
if media_item not in dataset.media_items:
abort(404)
template = "datasets/settings_media_item.html"
update_form_class_mapping = {
"graph": GraphForm,
"text": TextForm,
}
update_form_cls = update_form_class_mapping[media_item.type]
return render_template(
template,
update_media_item_form=update_form_cls(obj=media_item),
dataset=dataset,
create_media_item_form=create_media_item_form,
media_item=media_item)