Skip to content

Commit

Permalink
erdl#33 allow to edit
Browse files Browse the repository at this point in the history
  • Loading branch information
jyim3 committed Jan 29, 2018
1 parent 3da2d41 commit 0c01ce9
Show file tree
Hide file tree
Showing 20 changed files with 601 additions and 158 deletions.
4 changes: 2 additions & 2 deletions run.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/python3
from ubuntuStation import app, db
#from flask import Flask
import os

os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
app.run(debug=True, host='0.0.0.0', port=8989)

42 changes: 37 additions & 5 deletions ubuntuStation/forms.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from flask_wtf import FlaskForm
from .models import *
from wtforms import SelectField, StringField, BooleanField, RadioField, TextField, TextAreaField, SelectMultipleField, PasswordField
from wtforms import SelectField, IntegerField, BooleanField, RadioField, TextField, TextAreaField, SelectMultipleField, PasswordField, FieldList, FormField
from wtforms.validators import DataRequired, ValidationError

class UniqueValidator(object):
Expand All @@ -25,11 +25,35 @@ def __call__(self, form, field):
#print("Error")
raise ValidationError('Entry with this value already exists in the database')

'''

class QuestionEntryForm(FlaskForm):
#option=SelectField('option',validators=[DataRequired()],choices=[(o.text, o.text) for o in Option.query.distinct('text').order_by('text', 'option_id')])
option=TextField('option', validators=[DataRequired()], description=u'Option')
responseposition=IntegerField('responseposition',validators=[DataRequired()])
optioncolor=TextField('optioncolor', validators=[DataRequired()], description=u'Option Color')

class QuestionForm(FlaskForm):
questiontext = TextAreaField('questiontext', validators=[DataRequired()], description=u'Question')
questionurl = TextField('questionurl', validators=[DataRequired()], description=u'Question URL')
'''
questiontext = TextField('questiontext', validators=[DataRequired()], description=u'Question Text')
questiondescription = TextField('questiondescription', validators=[DataRequired()], description=u'Description')
questiontype = TextField('questiontype', validators=[DataRequired()], description=u'Type')
entries=FieldList(FormField(QuestionEntryForm), min_entries=1)

@classmethod
def new(cls):
form=cls()
return form

class EditQuestionForm(FlaskForm):
questiontext = TextField('questiontext', validators=[DataRequired()], description=u'Question Text')
questiondescription = TextField('questiondescription', validators=[DataRequired()], description=u'Description')
questiontype = TextField('questiontype', validators=[DataRequired()], description=u'Type')
entries=FieldList(FormField(QuestionEntryForm), min_entries=1)

@classmethod
def new(cls):
form=cls()
return form

'''
class ActiveQuestionForm(FlaskForm):
urls=ActiveQuestion.query.with_entities(ActiveQuestion.activequestionurl)
Expand Down Expand Up @@ -77,3 +101,11 @@ class LoginForm(FlaskForm):
username=TextField('username', description=u'Username', validators=[DataRequired()])
password=PasswordField('password', description=u'Password', validators=[DataRequired()])

class UserForm(FlaskForm):
name=TextField('name', description=u'Name', validators=[DataRequired(), UniqueValidator(User, User.name)])
email=TextField('email', description=u'Email', validators=[DataRequired(), UniqueValidator(User, User.email)])

@classmethod
def new(cls):
form=cls()
return form
45 changes: 10 additions & 35 deletions ubuntuStation/models.py
Original file line number Diff line number Diff line change
@@ -1,39 +1,13 @@
from . import db
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from sqlalchemy import PrimaryKeyConstraint, ForeignKeyConstraint
from passlib.apps import custom_app_context as pwd_context
from sqlalchemy import PrimaryKeyConstraint

'''
class User(UserMixin):
#database of users
user_database = {"Admin": ("Admin", "pass")}
def __init__(self, username, password):
self.id = username
self.password = password
@classmethod
def get(cls, id):
return cls.user_database.get(id)
'''

class User(UserMixin, db.Model):
__tablename__="users"
user_id=db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(32), index = True)
password_hash = db.Column(db.String(128))

def hash_password(self, password):
self.password_hash = pwd_context.encrypt(password)

def verify_password(self, password):
return pwd_context.verify(password, self.password_hash)

def __init__(self, username, password=None):
self.id = username
self.username = username
self.password = password
class User(db.Model, UserMixin):
__tablename__ = "oauth"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.Text, nullable=True)
email = db.Column(db.String(50), unique=True, nullable=False)
tokens = db.Column(db.Text)

class Question(db.Model):
__tablename__="question"
Expand All @@ -47,11 +21,12 @@ def __repr__(self):

class Option(db.Model):
__tablename__="option"
option_id=db.Column(db.Integer, primary_key=True, nullable=False)
question_id=db.Column(db.Integer, db.ForeignKey('question.question_id'), nullable=False)
text=db.Column(db.String(45), nullable=False)
option_id=db.Column(db.Integer, primary_key=True, nullable=False)
value=db.Column(db.String(45), nullable=False)
question_id=db.Column(db.Integer, db.ForeignKey('question.question_id'), nullable=False)
response_position=db.Column(db.Integer, nullable=False)
option_color=db.Column(db.String(7), nullable=False)

def __repr__(self):
return '<option_text %r>' % (self.text)
Expand Down
4 changes: 2 additions & 2 deletions ubuntuStation/static/bootstrap.css
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,8 @@ legend {
padding: 0;
}
textarea {
height: 100px;
width: 300px:
height: 120px;
width: 420px;
}
optgroup {
font-weight: bold;
Expand Down
Binary file added ubuntuStation/static/google_login.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
31 changes: 31 additions & 0 deletions ubuntuStation/static/questionpage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
$(function() {
$("div[data-toggle=fieldset]").each(function() {
var $this = $(this);

//Add new entry
$this.find("button[data-toggle=fieldset-add-row]").click(function() {
var target = $($(this).data("target"))
console.log(target);
var oldrow = target.find("[data-toggle=fieldset-entry]:last");
var row = oldrow.clone(true, true);
console.log(row.find(":input")[0]);
var elem_id = row.find(":input")[0].id;
var elem_num = parseInt(elem_id.replace(/.*-(\d{1,4})-.*/m, '$1')) + 1;
row.attr('data-id', elem_num);
row.find(":input").each(function() {
console.log(this);
var id = $(this).attr('id').replace('-' + (elem_num - 1) + '-', '-' + (elem_num) + '-');
$(this).attr('name', id).attr('id', id).val('').removeAttr("checked");
});
oldrow.after(row);
}); //End add new entry

//Remove row
$this.find("button[data-toggle=fieldset-remove-row]").click(function() {
if($this.find("[data-toggle=fieldset-entry]").length > 1) {
var thisRow = $(this).closest("[data-toggle=fieldset-entry]");
thisRow.remove();
}
}); //End remove row
});
});
12 changes: 11 additions & 1 deletion ubuntuStation/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Questions <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ url_for('show_questions') }}">View Questions</a></li>
<li><a href="{{ url_for('show_questions') }}">View Questions</a></li>
<li><a href="{{ url_for('question_form') }}">Create Question</a></li>

</ul>
</li>
<li class="dropdown">
Expand All @@ -34,6 +36,14 @@

</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Users <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ url_for('show_users') }}">Manage Users</a></li>
<li><a href="{{ url_for('create_user') }}">Add User</a></li>

</ul>
</li>
<li><a href="{{ url_for('tutorial') }}">Tutorial</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
Expand Down
37 changes: 27 additions & 10 deletions ubuntuStation/templates/edit_deployment_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,36 @@ <h1>Edit Deployment</h1>
<fieldset>
{{ form.hidden_tag() }}
<div class="form-group">
<p><b>URL:</b> {{ ks.url }}</p>
<p><b>Building:</b> {{ b.name }}</p>
<p>
<b>Kiosk View?</b>
{% if d.is_kioski %}
Yes
{% if 'url_text' in form %}
{{ render_field(form.url_text) }}
{% else %}
No
<label class="control-label" for="disabledInput">URL</label>
<input class="form-control" id="disabledInput" type="text" placeholder="Hello" disabled="">
{% endif %}
</p>
</div>
</div>
<div class="form-group">
{% if 'building_id' in form %}
{{ render_field(form.building_id) }}
{% else %}
<label class="control-label" for="disabledInput">Building ID</label>
<input class="form-control" id="disabledInput" type="text" placeholder="Hello" disabled="">
{% endif %}
</div>
<div class="form-group">
{{ render_field(form.survey_id) }}
{% if 'is_kiosk' in form %}
{{ render_field(form.is_kiosk) }}
{% else %}
<label class="control-label" for="disabledInput">Kiosk View</label>
<input class="form-control" id="disabledInput" type="text" placeholder="Hello" disabled="">
{% endif %}
</div>
<div class="form-group">
{% if 'survey_id' in form %}
{{ render_field(form.survey_id) }}
{% else %}
<label class="control-label" for="disabledInput">Survey Name</label>
<input class="form-control" id="disabledInput" type="text" placeholder="Hello" disabled="">
{% endif %}
</div>

<a href="{{ url_for('deployment_page', deployedurlid=did) }}" class="btn btn-default">Cancel</a>
Expand Down
63 changes: 63 additions & 0 deletions ubuntuStation/templates/edit_question_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{% extends "base.html" %}
{% block content %}
<div class="well">
{% from "_formhelpers.html" import render_field %}
{{ form.csrf_token }}
<h1>Edit Question</h1>
<p class="text-muted">Edit an existing question.</p>
<div class="container">
<form action={{ url_for('edit_question_form', questionid=qid) }} method="post" name="edit_question_form">
<fieldset>
{{ form.hidden_tag() }}
<div class="form-group">
{{ render_field(form.questiontext) }}
</div>
<div class="form-group">
{{ render_field(form.questiondescription) }}
</div>
<div class="form-group" style="margin-bottom:35px">
{{ render_field(form.questiontype) }}
</div>
<div data-toggle="fieldset" id="option-fieldset">
<label>Add more entries</label>
<button type="button" data-toggle="fieldset-add-row"
data-target="#option-fieldset">+</button>
<table>
<tr>
<th>Option</th>
<th>Response Position</th>
<th>
<a href="http://www.color-hex.com/" target="_blank" >Option Color</a>
</th>
</tr>
{% for entries in form.entries %}
<tr data-toggle="fieldset-entry">
<td>{{ entries.option }}</td>
<td>{{ entries.responseposition }}</td>
<td>{{ entries.optioncolor }}</td>
<td><button type="button" data-toggle="fieldset-remove-row" id="entries-{{loop.index0}}-remove">-</button></td>
</tr>
{% endfor %}
</table>
</div>
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>
<script src="{{ url_for("static", filename="questionpage.js") }}"></script>
<script type="text/javascript">
var csrf_token = "{{ csrf_token() }}";

$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrf_token);
}
}
});
</script>
<a href="{{ url_for('question_page', questionid=qid) }}" class="btn btn-default">Cancel</a>
<button type ="submit" name="action" class="btn btn-primary" value="Submit">Submit</button>
<!--<button type ="submit" name="action" style="margin-right:150px;float:right" class="btn btn-danger" value="Delete">Delete</button>-->
</fieldset>
</form>
</div>
</div>
{% endblock %}
28 changes: 28 additions & 0 deletions ubuntuStation/templates/edit_survey_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{% extends "base.html" %}
{% block content %}
<div class="well">
{% from "_formhelpers.html" import render_field %}
{{ form.csrf_token }}
<h1>Edit Survey</h1>
<p class="text-muted">Edit an existing survey.</p>
<div class="container">
<form action={{ url_for('edit_survey_form', surveyid=sid) }} method="post" name="edit_survey_form">
<fieldset>
{{ form.hidden_tag() }}
<div class="form-group">
{{ render_field(form.surveyname) }}
</div>
<div class="form-group">
{{ render_field(form.description) }}
</div>
<div class="form-group">
{{ render_field(form.question) }}
</div>
<a href="{{ url_for('show_surveys') }}" class="btn btn-default">Cancel</a>
<button type ="submit" name="action" class="btn btn-primary" value="Submit">Submit</button>
<!--<button type ="submit" name="action" style="margin-right:150px;float:right" class="btn btn-danger" value="Delete">Delete</button>-->
</fieldset>
</form>
</div>
</div>
{% endblock %}
25 changes: 25 additions & 0 deletions ubuntuStation/templates/edit_user_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{% extends "base.html" %}
{% block content %}
<div class="well">
{% from "_formhelpers.html" import render_field %}
{{ form.csrf_token }}
<h1>Edit User</h1>
<p class="text-muted">Edit an user's credentials.</p>
<div class="container">
<form action={{ url_for('edit_user_form', id=id) }} method="post" name="edit_user_form">
<fieldset>
{{ form.hidden_tag() }}
<div class="form-group">
{{ render_field(form.name) }}
</div>
<div class="form-group">
{{ render_field(form.email) }}
</div>
<a href="{{ url_for('show_users') }}" class="btn btn-default">Cancel</a>
<button type ="submit" name="action" class="btn btn-primary" value="Submit">Submit</button>
<!--<button type ="submit" name="action" style="margin-right:150px;float:right" class="btn btn-danger" value="Delete">Delete</button>-->
</fieldset>
</form>
</div>
</div>
{% endblock %}
14 changes: 1 addition & 13 deletions ubuntuStation/templates/login.html
Original file line number Diff line number Diff line change
@@ -1,22 +1,10 @@
{% extends "base.html" %}
{% block content %}
<div class="well">
{% from "_formhelpers.html" import render_field %}
{{ form.csrf_token }}
<h1>Log In</h1>
<p class="text-danger">You must log in to see this page.</p>
<div class="container">
<form action="/login" method="post" name="login_form">
{{ form.hidden_tag() }}
<div class="form-group">
{{ render_field(form.username) }}
</div>
<div class="form-group">
{{ render_field(form.password) }}
</div>
<button type=submit class="btn btn-primary" value=Submit>Submit</button>
</fieldset>
</form>
<a href="{{auth_url}}" class="btn";"><img src="static/google_login.png" width="335.2" height="68.8"></a>
</div>
</div>
{% endblock %}
Loading

0 comments on commit 0c01ce9

Please sign in to comment.