Refactoring
This commit is contained in:
parent
08f95dcb99
commit
971b37c4d2
@ -23,9 +23,10 @@ thumb = Thumbnail(app)
|
|||||||
assets = Environment(app)
|
assets = Environment(app)
|
||||||
|
|
||||||
# Import controllers
|
# Import controllers
|
||||||
from models import model
|
#from models import model
|
||||||
from controllers.shots import shots
|
from application.modules.main import homepage
|
||||||
from controllers.projects import projects
|
from application.modules.shots import shots
|
||||||
|
from application.modules.projects import projects
|
||||||
|
|
||||||
# Register blueprints for the imported controllers
|
# Register blueprints for the imported controllers
|
||||||
app.register_blueprint(filemanager)
|
app.register_blueprint(filemanager)
|
||||||
|
@ -1,98 +0,0 @@
|
|||||||
from flask import (abort,
|
|
||||||
Blueprint,
|
|
||||||
jsonify,
|
|
||||||
render_template,
|
|
||||||
redirect,
|
|
||||||
request)
|
|
||||||
|
|
||||||
from flask.ext.thumbnails import Thumbnail
|
|
||||||
from flask.ext.sqlalchemy import SQLAlchemy
|
|
||||||
from sqlalchemy.orm import aliased
|
|
||||||
|
|
||||||
from flask_wtf import Form
|
|
||||||
from wtforms import TextField, BooleanField
|
|
||||||
from wtforms.validators import DataRequired
|
|
||||||
|
|
||||||
from application import db
|
|
||||||
|
|
||||||
from application.models.model import (
|
|
||||||
Node,
|
|
||||||
NodeType)
|
|
||||||
|
|
||||||
# Name of the Blueprint
|
|
||||||
shots = Blueprint('shots', __name__)
|
|
||||||
|
|
||||||
@shots.route("/")
|
|
||||||
def index():
|
|
||||||
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,
|
|
||||||
status=status))
|
|
||||||
return render_template('shots/index.html',
|
|
||||||
title='shots',
|
|
||||||
shots=shots)
|
|
||||||
|
|
||||||
|
|
||||||
@shots.route("/view/<int:shot_id>")
|
|
||||||
def view(shot_id):
|
|
||||||
shot = Node.query.get(shot_id)
|
|
||||||
if shot and shot.node_type.url == 'shot':
|
|
||||||
return render_template('shots/view.html',
|
|
||||||
title='shots',
|
|
||||||
shot=shot)
|
|
||||||
else:
|
|
||||||
abort(404)
|
|
||||||
|
|
||||||
|
|
||||||
class ShotForm(Form):
|
|
||||||
name = TextField('Shot Name', validators=[DataRequired()])
|
|
||||||
description = TextField('Description', validators=[DataRequired()])
|
|
||||||
|
|
||||||
@shots.route("/create", methods=('GET', 'POST'))
|
|
||||||
def create():
|
|
||||||
form = ShotForm()
|
|
||||||
if form.validate_on_submit():
|
|
||||||
shot_type = NodeType.query.filter_by(name='shot').first()
|
|
||||||
shot = Node(
|
|
||||||
name=form.name.data,
|
|
||||||
description=form.description.data,
|
|
||||||
node_type_id=shot_type.id)
|
|
||||||
db.session.add(shot)
|
|
||||||
db.session.commit()
|
|
||||||
return redirect('/')
|
|
||||||
return render_template('shots/create.html', form=form)
|
|
||||||
|
|
||||||
|
|
||||||
@shots.route("/edit/<int:shot_id>", methods=('GET', 'POST'))
|
|
||||||
def edit(shot_id):
|
|
||||||
shot = Node.query.get(shot_id)
|
|
||||||
form = ShotForm(
|
|
||||||
name=shot.name,
|
|
||||||
description=shot.description)
|
|
||||||
if form.validate_on_submit():
|
|
||||||
shot.name = form.name.data
|
|
||||||
shot.description=form.description.data
|
|
||||||
db.session.commit()
|
|
||||||
return redirect('/')
|
|
||||||
return render_template(
|
|
||||||
'shots/edit.html',
|
|
||||||
form=form,
|
|
||||||
shot_id=shot_id)
|
|
||||||
|
|
||||||
|
|
||||||
@shots.route("/delete/<int:shot_id>")
|
|
||||||
def delete(shot_id):
|
|
||||||
shot = Node.query.get(shot_id)
|
|
||||||
if shot:
|
|
||||||
db.session.delete(shot)
|
|
||||||
return redirect('/')
|
|
||||||
else:
|
|
||||||
abort(404)
|
|
0
attract/application/modules/__init__.py
Normal file
0
attract/application/modules/__init__.py
Normal file
@ -1,5 +1,5 @@
|
|||||||
from application import app
|
from application import app
|
||||||
from application.controllers.shots import index
|
from application.modules.shots import index
|
||||||
|
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
def homepage():
|
def homepage():
|
0
attract/application/modules/nodes/__init__.py
Normal file
0
attract/application/modules/nodes/__init__.py
Normal file
@ -1,7 +1,6 @@
|
|||||||
from application import app
|
from application import app
|
||||||
from application import db
|
from application import db
|
||||||
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import os.path as op
|
import os.path as op
|
||||||
import datetime
|
import datetime
|
||||||
@ -10,17 +9,6 @@ import hashlib
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
from werkzeug import secure_filename
|
from werkzeug import secure_filename
|
||||||
from sqlalchemy import event
|
|
||||||
from sqlalchemy.event import listens_for
|
|
||||||
|
|
||||||
from flask import (
|
|
||||||
render_template,
|
|
||||||
jsonify,
|
|
||||||
redirect,
|
|
||||||
url_for,
|
|
||||||
request)
|
|
||||||
|
|
||||||
from flask.ext.sqlalchemy import SQLAlchemy
|
|
||||||
|
|
||||||
|
|
||||||
def prefix_name(obj, file_data):
|
def prefix_name(obj, file_data):
|
||||||
@ -63,10 +51,10 @@ class NodeType(db.Model):
|
|||||||
|
|
||||||
|
|
||||||
# Create Many to Many table
|
# Create Many to Many table
|
||||||
nodes_assets_table = db.Table('nodes_assets', db.Model.metadata,
|
# nodes_assets_table = db.Table('nodes_assets', db.Model.metadata,
|
||||||
db.Column('node_id', db.Integer, db.ForeignKey('node.id')),
|
# db.Column('node_id', db.Integer, db.ForeignKey('node.id')),
|
||||||
db.Column('asset_id', db.Integer, db.ForeignKey('asset.id'))
|
# db.Column('asset_id', db.Integer, db.ForeignKey('asset.id'))
|
||||||
)
|
# )
|
||||||
|
|
||||||
|
|
||||||
class Node(db.Model):
|
class Node(db.Model):
|
||||||
@ -88,47 +76,8 @@ class Node(db.Model):
|
|||||||
status_id = db.Column(db.Integer(), db.ForeignKey(Status.id))
|
status_id = db.Column(db.Integer(), db.ForeignKey(Status.id))
|
||||||
status = db.relationship(Status, backref='Node')
|
status = db.relationship(Status, backref='Node')
|
||||||
|
|
||||||
assets = db.relationship('Asset', secondary=nodes_assets_table)
|
#assets = db.relationship('Asset', secondary=nodes_assets_table)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create Many to Many table
|
|
||||||
"""
|
|
||||||
assets_tags_table = db.Table('assets_tags', db.Model.metadata,
|
|
||||||
db.Column('asset_id', db.Integer, db.ForeignKey('asset.id')),
|
|
||||||
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
|
|
||||||
)
|
|
||||||
"""
|
|
||||||
|
|
||||||
class Asset(db.Model):
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
|
||||||
name = db.Column(db.String(120), nullable=False)
|
|
||||||
description = db.Column(db.Text, nullable=False)
|
|
||||||
link = db.Column(db.String(512))
|
|
||||||
picture = db.Column(db.String(80))
|
|
||||||
size = db.Column(db.String(7))
|
|
||||||
format = db.Column(db.String(15))
|
|
||||||
duration = db.Column(db.String(15))
|
|
||||||
|
|
||||||
nodes = db.relationship('Node', secondary=nodes_assets_table)
|
|
||||||
|
|
||||||
#tags = db.relationship('Tag', secondary=assets_tags_table)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
class Tag(db.Model):
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
|
||||||
name = db.Column(db.Unicode(64))
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
@ -9,9 +9,8 @@ from flask.ext.thumbnails import Thumbnail
|
|||||||
from flask.ext.sqlalchemy import SQLAlchemy
|
from flask.ext.sqlalchemy import SQLAlchemy
|
||||||
from sqlalchemy.orm import aliased
|
from sqlalchemy.orm import aliased
|
||||||
|
|
||||||
from application.models.model import (
|
from application.modules.shots import Node
|
||||||
Node,
|
from application.modules.shots import NodeType
|
||||||
NodeType)
|
|
||||||
|
|
||||||
# Name of the Blueprint
|
# Name of the Blueprint
|
||||||
projects = Blueprint('projects', __name__)
|
projects = Blueprint('projects', __name__)
|
129
attract/application/modules/shots/__init__.py
Normal file
129
attract/application/modules/shots/__init__.py
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
from flask import (abort,
|
||||||
|
Blueprint,
|
||||||
|
jsonify,
|
||||||
|
render_template,
|
||||||
|
redirect,
|
||||||
|
request,
|
||||||
|
flash)
|
||||||
|
|
||||||
|
from flask.ext.thumbnails import Thumbnail
|
||||||
|
from flask.ext.sqlalchemy import SQLAlchemy
|
||||||
|
from sqlalchemy.orm import aliased
|
||||||
|
|
||||||
|
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 import db
|
||||||
|
|
||||||
|
from application.modules.nodes.models import Node, NodeType, Status
|
||||||
|
from application.modules.shots.models import NodeShot
|
||||||
|
|
||||||
|
|
||||||
|
# Name of the Blueprint
|
||||||
|
shots = Blueprint('shots', __name__)
|
||||||
|
|
||||||
|
@shots.route("/")
|
||||||
|
def index():
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
@shots.route("/view/<int:shot_id>")
|
||||||
|
def view(shot_id):
|
||||||
|
shot = Node.query.get(shot_id)
|
||||||
|
if shot and shot.node_type.url == 'shot':
|
||||||
|
return render_template('shots/view.html',
|
||||||
|
title='shots',
|
||||||
|
shot=shot,
|
||||||
|
notes=shot.node_shot[0].notes)
|
||||||
|
else:
|
||||||
|
abort(404)
|
||||||
|
|
||||||
|
|
||||||
|
class ShotForm(Form):
|
||||||
|
name = TextField('Shot Name', validators=[DataRequired()])
|
||||||
|
description = TextAreaField('Description', validators=[DataRequired()])
|
||||||
|
status_id = SelectField('Status', coerce=int)
|
||||||
|
duration = IntegerField('Duration')
|
||||||
|
notes = TextAreaField('Notes')
|
||||||
|
|
||||||
|
|
||||||
|
@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(
|
||||||
|
name=form.name.data,
|
||||||
|
description=form.description.data,
|
||||||
|
node_type_id=shot_type.id,
|
||||||
|
status_id=form.status_id.data)
|
||||||
|
# Create entry in the attached node table
|
||||||
|
shot.node_shot = [NodeShot(
|
||||||
|
duration=form.duration.data,
|
||||||
|
notes=form.notes.data)]
|
||||||
|
|
||||||
|
db.session.add(shot)
|
||||||
|
db.session.commit()
|
||||||
|
return redirect('/')
|
||||||
|
return render_template('shots/create.html', form=form)
|
||||||
|
|
||||||
|
|
||||||
|
@shots.route("/edit/<int:shot_id>", methods=('GET', 'POST'))
|
||||||
|
def edit(shot_id):
|
||||||
|
shot = Node.query.get(shot_id)
|
||||||
|
|
||||||
|
form = ShotForm(
|
||||||
|
name=shot.name,
|
||||||
|
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()]
|
||||||
|
|
||||||
|
if form.validate_on_submit():
|
||||||
|
print shot.node_shot
|
||||||
|
shot.name = form.name.data
|
||||||
|
shot.description = form.description.data
|
||||||
|
shot.node_shot[0].duration = form.duration.data
|
||||||
|
shot.status_id = form.status_id.data
|
||||||
|
shot.node_shot[0].notes = form.notes.data
|
||||||
|
db.session.commit()
|
||||||
|
return redirect('/')
|
||||||
|
return render_template(
|
||||||
|
'shots/edit.html',
|
||||||
|
form=form,
|
||||||
|
shot_id=shot_id)
|
||||||
|
|
||||||
|
|
||||||
|
@shots.route("/delete/<int:shot_id>")
|
||||||
|
def delete(shot_id):
|
||||||
|
shot = Node.query.get(shot_id)
|
||||||
|
if shot:
|
||||||
|
db.session.delete(shot)
|
||||||
|
db.session.commit()
|
||||||
|
return redirect('/')
|
||||||
|
else:
|
||||||
|
abort(404)
|
53
attract/application/modules/shots/models.py
Normal file
53
attract/application/modules/shots/models.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
from application import app
|
||||||
|
from application import db
|
||||||
|
|
||||||
|
from application.modules.nodes.models import Node
|
||||||
|
|
||||||
|
class NodeShot(db.Model):
|
||||||
|
"""docstring for NodeShot"""
|
||||||
|
id = db.Column(db.Integer, primary_key = True)
|
||||||
|
duration = db.Column(db.Integer, nullable=False)
|
||||||
|
notes = db.Column(db.Text)
|
||||||
|
|
||||||
|
node_id = db.Column(db.Integer, db.ForeignKey(Node.id))
|
||||||
|
node = db.relationship(Node, backref='node_shot', uselist=False)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Create Many to Many table
|
||||||
|
"""
|
||||||
|
assets_tags_table = db.Table('assets_tags', db.Model.metadata,
|
||||||
|
db.Column('asset_id', db.Integer, db.ForeignKey('asset.id')),
|
||||||
|
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
|
||||||
|
# class Asset(db.Model):
|
||||||
|
# id = db.Column(db.Integer, primary_key=True)
|
||||||
|
# name = db.Column(db.String(120), nullable=False)
|
||||||
|
# description = db.Column(db.Text, nullable=False)
|
||||||
|
# link = db.Column(db.String(512))
|
||||||
|
# picture = db.Column(db.String(80))
|
||||||
|
# size = db.Column(db.String(7))
|
||||||
|
# format = db.Column(db.String(15))
|
||||||
|
# duration = db.Column(db.String(15))
|
||||||
|
|
||||||
|
# nodes = db.relationship('Node', secondary=nodes_assets_table)
|
||||||
|
|
||||||
|
# #tags = db.relationship('Tag', secondary=assets_tags_table)
|
||||||
|
|
||||||
|
# def __str__(self):
|
||||||
|
# return self.name
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
class Tag(db.Model):
|
||||||
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
name = db.Column(db.Unicode(64))
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
@ -15,6 +15,18 @@
|
|||||||
{{ form.description.label }}
|
{{ form.description.label }}
|
||||||
{{ form.description(size=20, class='form-control') }}
|
{{ form.description(size=20, class='form-control') }}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.duration.label }}
|
||||||
|
{{ form.duration(size=20, class='form-control') }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.status_id.label }}
|
||||||
|
{{ form.status_id(class='form-control') }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.notes.label }}
|
||||||
|
{{ form.notes(class='form-control') }}
|
||||||
|
</div>
|
||||||
<input class="btn btn-default" type="submit" value="Create Shot">
|
<input class="btn btn-default" type="submit" value="Create Shot">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -15,7 +15,23 @@
|
|||||||
{{ form.description.label }}
|
{{ form.description.label }}
|
||||||
{{ form.description(size=20, class='form-control') }}
|
{{ form.description(size=20, class='form-control') }}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.duration.label }}
|
||||||
|
{{ form.duration(size=20, class='form-control') }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.status_id.label }}
|
||||||
|
{{ form.status_id(class='form-control') }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.notes.label }}
|
||||||
|
{{ form.notes(class='form-control') }}
|
||||||
|
</div>
|
||||||
<input class="btn btn-default" type="submit" value="Edit Shot">
|
<input class="btn btn-default" type="submit" value="Edit Shot">
|
||||||
|
<div class="pull-right">
|
||||||
|
<a class="btn btn-default" href="{{url_for('shots.index')}}">Cancel</a>
|
||||||
|
<a class="btn btn-danger" href="{{url_for('shots.delete', shot_id=shot_id)}}">Delete</a>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -20,11 +20,19 @@
|
|||||||
{% for shot in shots %}
|
{% for shot in shots %}
|
||||||
<tr id="row_{{shot['id']}}">
|
<tr id="row_{{shot['id']}}">
|
||||||
<td><a href="{{url_for('shots.view', shot_id=shot['id'])}}">{{shot['name']}}</a></td>
|
<td><a href="{{url_for('shots.view', shot_id=shot['id'])}}">{{shot['name']}}</a></td>
|
||||||
<td>{{shot['description']}}</td>
|
<td>
|
||||||
<td></td>
|
{% if shot['description'] %}
|
||||||
|
{{shot['description']|truncate(25)}}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>{{shot['duration']}}</td>
|
||||||
<td><span class="label label-default" style="background-color:<?php echo $shot['status_color'] ?>">{{shot['status']}}</span></td>
|
<td><span class="label label-default" style="background-color:<?php echo $shot['status_color'] ?>">{{shot['status']}}</span></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td></td>
|
<td>
|
||||||
|
{% if shot['notes'] %}
|
||||||
|
{{shot['notes']|truncate(25)}}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a class="btn btn-default btn-xs" href="{{url_for('shots.edit', shot_id=shot['id'])}}"><i class="glyphicon glyphicon-edit"></i> Edit</a>
|
<a class="btn btn-default btn-xs" href="{{url_for('shots.edit', shot_id=shot['id'])}}"><i class="glyphicon glyphicon-edit"></i> Edit</a>
|
||||||
</td>
|
</td>
|
||||||
|
@ -9,6 +9,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<p>{{shot['description']}}</p>
|
<p>{{shot['description']}}</p>
|
||||||
|
<p>
|
||||||
|
{% if notes %}
|
||||||
|
{{notes}}
|
||||||
|
{% else %}
|
||||||
|
No notes at the moment
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user