Added commenting system

Needs some styling, but it works ok.
This commit is contained in:
2014-07-16 16:38:43 +02:00
parent 76ece294db
commit 98ed71e9a8
5 changed files with 89 additions and 27 deletions

View File

@@ -1,16 +1,13 @@
import datetime
from application import db
from application.forms import CommentForm
from application.models.users import *
from application.models.applications import Application, Skill, ReviewersApplications
from application.models.applications import Application, Skill, ReviewersApplications, Comment
from flask import render_template, redirect, url_for, request, Blueprint
from flask.ext.security import login_required, roles_accepted
from flask.ext.security.core import current_user
from flask_wtf import Form
from wtforms import TextField, TextAreaField, BooleanField, SelectMultipleField
from wtforms.validators import DataRequired
from wtforms.fields.html5 import URLField
from wtforms.validators import url
applications = Blueprint('applications', __name__)
@@ -24,6 +21,9 @@ def index():
@applications.route('/view/<int:id>')
@roles_accepted('bfct_board', 'bfct_manager', 'admin')
def view(id):
comment_form = CommentForm()
review = ReviewersApplications.query.\
filter_by(application_id=id).\
filter_by(reviewer_blender_id=current_user.id).\
@@ -37,7 +37,8 @@ def view(id):
title='applications',
application=Application.query.get_or_404(id),
review=review,
reviews=reviews)
reviews=reviews,
comment_form=comment_form)
@applications.route('/vote/<int:approved>/<int:id>')
@roles_accepted('bfct_board', 'bfct_manager', 'admin')
@@ -92,3 +93,19 @@ def final_review(approved, id):
db.session.commit()
return redirect(url_for('.view', id=id))
@applications.route('/comment/<int:application_id>', methods=['POST'])
@roles_accepted('bfct_board', 'bfct_manager', 'admin')
def comment(application_id):
comment_form = CommentForm()
if comment_form.validate_on_submit():
comment = Comment(
blender_id=current_user.id,
application_id=application_id,
text=comment_form.text.data)
db.session.add(comment)
db.session.commit()
return redirect(url_for('.view', id=application_id))

View File

@@ -1,4 +1,5 @@
from application import app, db
from application.forms import ApplicationForm
from application.emails import send_email_notification_new_submission
from application.models.users import *
from application.models.applications import Application, Skill
@@ -7,24 +8,6 @@ from flask import render_template, redirect, url_for, request, flash
from flask.ext.security import login_required
from flask.ext.security.core import current_user
from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound
from flask_wtf import Form
from wtforms import TextField, TextAreaField, BooleanField, SelectMultipleField
from wtforms.validators import DataRequired
from wtforms.fields.html5 import URLField
from wtforms.validators import url
class ApplicationForm(Form):
network_profile = TextField('Blender Network Profile')
website = URLField(validators=[url(), DataRequired()])
city_country = TextField('City and Country', validators=[DataRequired()])
teaching = BooleanField('Teaching')
institution_name = TextField('School or institution name')
skills = SelectMultipleField('Areas of expertise', coerce=int)
video_example = URLField(validators=[url(), DataRequired()])
written_example = URLField(validators=[url(), DataRequired()])
portfolio_cv = URLField(validators=[url(), DataRequired()])
bio_message = TextAreaField('Your message for the board', validators=[DataRequired()])
# Views

View File

@@ -0,0 +1,20 @@
from flask_wtf import Form
from wtforms import TextField, TextAreaField, BooleanField, SelectMultipleField
from wtforms.validators import DataRequired
from wtforms.fields.html5 import URLField
from wtforms.validators import url
class ApplicationForm(Form):
network_profile = TextField('Blender Network Profile')
website = URLField(validators=[url(), DataRequired()])
city_country = TextField('City and Country', validators=[DataRequired()])
teaching = BooleanField('Teaching')
institution_name = TextField('School or institution name')
skills = SelectMultipleField('Areas of expertise', coerce=int)
video_example = URLField(validators=[url(), DataRequired()])
written_example = URLField(validators=[url(), DataRequired()])
portfolio_cv = URLField(validators=[url(), DataRequired()])
bio_message = TextAreaField('Your message for the board', validators=[DataRequired()])
class CommentForm(Form):
text = TextAreaField('Your comment', validators=[DataRequired()])

View File

@@ -1,6 +1,5 @@
import datetime
from application import app
from application import db
from application import app, db
from application.helpers import pretty_date
from users import User
@@ -83,3 +82,26 @@ class ReviewersApplications(db.Model):
@property
def reviewer(self):
return User.query.get_or_404(self.reviewer_blender_id)
class Comment(db.Model):
"""Comments to an application. Only BFCT board members can add comments
via the applications review inferface"""
id = db.Column(db.Integer(), primary_key=True)
application_id = db.Column(db.Integer(), db.ForeignKey(Application.id), nullable=False)
application = db.relationship('Application', backref='comments')
blender_id = db.Column(db.Integer(), nullable=False)
text = db.Column(db.Text())
creation_date = db.Column(db.DateTime(), default=datetime.datetime.now)
@property
def pretty_creation_date(self):
return pretty_date(self.creation_date)
@property
def user(self):
return User.query.get_or_404(self.blender_id)

View File

@@ -133,6 +133,26 @@
</div>
</div>
{% endif %}
<div class="row">
<div class="col-md-12">
<h2>Comments</h2>
{% for comment in application.comments %}
<p>{{comment.pretty_creation_date}}
<p>{{comment.user.first_name}} {{comment.user.last_name}}</p>
<p>{{comment.text}}</p>
<hr>
{% endfor %}
<form class="form-horizontal" method="POST" action="{{url_for('applications.comment', application_id=application.id)}}">
<fieldset>
{{ comment_form.hidden_tag() }}
{{ comment_form.text(class="form-controllo") }}
<button class="btn btn-default btn-squishy width-half pull-right offset-top-2" type="submit" value="Go">
Comment
</button>
</fieldset>
</form>
</div>
</div>
</div>
{% if current_user.has_role('admin') %}
{% if not application.review_end_date %}