diff --git a/attract/application/__init__.py b/attract/application/__init__.py index d2e2995e..a635f2b2 100644 --- a/attract/application/__init__.py +++ b/attract/application/__init__.py @@ -23,7 +23,7 @@ thumb = Thumbnail(app) assets = Environment(app) # Import controllers -#from models import model +from application.modules.nodes import nodes from application.modules.main import homepage from application.modules.shots import shots from application.modules.projects import projects @@ -32,3 +32,4 @@ from application.modules.projects import projects app.register_blueprint(filemanager) app.register_blueprint(shots, url_prefix='/shots') app.register_blueprint(projects, url_prefix='/projects') +app.register_blueprint(nodes, url_prefix='/nodes') diff --git a/attract/application/modules/nodes/__init__.py b/attract/application/modules/nodes/__init__.py index e69de29b..a1c3ef66 100644 --- a/attract/application/modules/nodes/__init__.py +++ b/attract/application/modules/nodes/__init__.py @@ -0,0 +1,62 @@ +from flask import abort +from flask import Blueprint +from flask import jsonify +from flask import render_template +from flask import redirect +from flask import request +from flask import flash +from flask import url_for + +from application import db + +from application.modules.nodes.models import Node, NodeType +from application.modules.nodes.forms import NodeTypeForm + + +# Name of the Blueprint +nodes = Blueprint('nodes', __name__) + +@nodes.route("/") +def index(): + """Display the node types + """ + node_types = [t for t in NodeType.query.all()] + + return render_template('nodes/index.html', + title='nodes', + node_types=node_types) + + shots = [] + for shot in Node.query.\ + join(NodeType).\ + filter(NodeType.url == 'shot'): + status = None + if shot.status: + status = shot.status.name + shots.append(dict( + id=shot.id, + name=shot.name, + description=shot.description, + duration=shot.node_shot[0].duration, + status=status, + notes=shot.node_shot[0].notes)) + return render_template('shots/index.html', + title='shots', + shots=shots) + + +@nodes.route("/create", methods=('GET', 'POST')) +def create(): + form = NodeTypeForm() + + if form.validate_on_submit(): + node_type = NodeType( + name=form.name.data, + description=form.description.data, + url=form.url.data) + + db.session.add(node_type) + db.session.commit() + + return redirect(url_for('nodes.index')) + return render_template('nodes/create.html', form=form) diff --git a/attract/application/modules/nodes/forms.py b/attract/application/modules/nodes/forms.py new file mode 100644 index 00000000..3d031360 --- /dev/null +++ b/attract/application/modules/nodes/forms.py @@ -0,0 +1,16 @@ +from flask_wtf import Form +from wtforms import TextField +from wtforms import BooleanField +from wtforms import SelectField +from wtforms import TextAreaField +from wtforms import IntegerField + +from wtforms.validators import DataRequired + +from application.modules.nodes.models import Node, NodeType + +class NodeTypeForm(Form): + name = TextField('Node Name', validators=[DataRequired()]) + url = TextField('Url', validators=[DataRequired()]) + description = TextAreaField('Description', validators=[DataRequired()]) + is_extended = BooleanField('Is extended') \ No newline at end of file diff --git a/attract/application/modules/nodes/models.py b/attract/application/modules/nodes/models.py index 8af71412..252fce3d 100644 --- a/attract/application/modules/nodes/models.py +++ b/attract/application/modules/nodes/models.py @@ -50,12 +50,6 @@ class NodeType(db.Model): return self.name -# Create Many to Many table -# nodes_assets_table = db.Table('nodes_assets', db.Model.metadata, -# db.Column('node_id', db.Integer, db.ForeignKey('node.id')), -# db.Column('asset_id', db.Integer, db.ForeignKey('asset.id')) -# ) - class Node(db.Model): id = db.Column(db.Integer, primary_key = True) @@ -76,8 +70,6 @@ class Node(db.Model): status_id = db.Column(db.Integer(), db.ForeignKey(Status.id)) status = db.relationship(Status, backref='Node') - #assets = db.relationship('Asset', secondary=nodes_assets_table) - def __str__(self): return self.name diff --git a/attract/application/modules/shots/__init__.py b/attract/application/modules/shots/__init__.py index 7984bd3d..7f28e5c8 100644 --- a/attract/application/modules/shots/__init__.py +++ b/attract/application/modules/shots/__init__.py @@ -13,7 +13,7 @@ from sqlalchemy.orm import aliased from application import db from application.modules.shots.forms import ShotForm -from application.modules.nodes.models import Node, NodeType, Status +from application.modules.nodes.models import Node, NodeType from application.modules.shots.models import NodeShot @@ -56,8 +56,7 @@ def view(shot_id): @shots.route("/create", methods=('GET', 'POST')) def create(): form = ShotForm() - # Populate dropdown select with available Statuses - form.status_id.choices = [(status.id, status.name) for status in Status.query.all()] + if form.validate_on_submit(): shot_type = NodeType.query.filter_by(url='shot').first() shot = Node( @@ -85,7 +84,7 @@ def edit(shot_id): description=shot.description, duration=shot.node_shot[0].duration, note=shot.node_shot[0].notes) - form.status_id.choices = [(status.id, status.name) for status in Status.query.all()] + #form.status_id.choices = [(status.id, status.name) for status in Status.query.all()] if form.validate_on_submit(): print shot.node_shot diff --git a/attract/application/modules/shots/forms.py b/attract/application/modules/shots/forms.py index 56000cfd..74089751 100644 --- a/attract/application/modules/shots/forms.py +++ b/attract/application/modules/shots/forms.py @@ -7,9 +7,18 @@ from wtforms import IntegerField from wtforms.validators import DataRequired +from application.modules.nodes.models import Node, NodeType + class ShotForm(Form): + statuses = Node.query\ + .join(NodeType)\ + .filter(NodeType.url == 'shot_status')\ + .all() + name = TextField('Shot Name', validators=[DataRequired()]) description = TextAreaField('Description', validators=[DataRequired()]) - status_id = SelectField('Status', coerce=int) + status_id = SelectField('Status', + coerce=int, + choices=[(status.id, status.name) for status in statuses]) duration = IntegerField('Duration') notes = TextAreaField('Notes') diff --git a/attract/application/templates/nodes/create.html b/attract/application/templates/nodes/create.html new file mode 100644 index 00000000..d9a9b147 --- /dev/null +++ b/attract/application/templates/nodes/create.html @@ -0,0 +1,31 @@ +{% extends 'layout.html' %} + +{% block body %} +
+

Create Node type

+
+
+
+ {{ form.hidden_tag() }} +
+ {{ form.name.label }} + {{ form.name(size=20, class='form-control') }} +
+
+ {{ form.description.label }} + {{ form.description(size=20, class='form-control') }} +
+
+ {{ form.url.label }} + {{ form.url(size=20, class='form-control') }} +
+
+ {{ form.is_extended.label }} + {{ form.is_extended(class='form-control') }} +
+ +
+
+
+
+{% endblock %} diff --git a/attract/application/templates/nodes/index.html b/attract/application/templates/nodes/index.html new file mode 100644 index 00000000..17e69ed9 --- /dev/null +++ b/attract/application/templates/nodes/index.html @@ -0,0 +1,51 @@ +{% extends 'layout.html' %} + +{% block body %} +
+
+
+ + + + + + + + + + + {% for node_type in node_types %} + + + + + + + {% endfor %} + + + + + + + + + + + +
Node NameUrlDescription
{{node_type.name}}{{node_type.url}} + {% if node_type.description %} + {{node_type.description|truncate(25)}} + {% endif %} + + Edit +
Node NameUrlDescription
+
+
+
+
+ Create +
+
+
+{% endblock %}