From 8ef0791f5be434a98ed1ab44395a80900074d01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Heikkil=C3=A4?= <timo.t.heikkila@utu.fi> Date: Wed, 28 Nov 2018 21:17:05 +0200 Subject: [PATCH] =?UTF-8?q?uusi=20p=C3=A4ivitys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.db | Bin 94208 -> 122880 bytes app/__init__.py | 51 +- app/forms.py | 39 +- app/messages.pot | 19 - app/models.py | 35 +- app/rating_tool.py | 6 +- app/routes.py | 1085 ++++++++++++----- app/static/css/custom.css | 12 +- app/static/css/slider.css | 6 + app/templates/add_stimuli.html | 21 +- app/templates/admin_dryrun.html | 29 + app/templates/base.html | 50 +- app/templates/begin_with_id.html | 9 +- app/templates/consent.html | 35 +- app/templates/continue_task.html | 4 +- app/templates/create_experiment.html | 43 +- .../create_experiment_questions.html | 4 +- .../create_experiment_upload_stimuli.html | 6 +- app/templates/edit_experiment.html | 21 +- app/templates/experiment_statistics.html | 82 +- app/templates/index.html | 105 +- app/templates/instructions.html | 10 +- app/templates/quit_task.html | 10 +- app/templates/register.html | 8 +- app/templates/researcher_info.html | 2 +- app/templates/task.html | 59 +- app/templates/task_completed.html | 6 +- app/templates/test_page.html | 12 + .../upload_research_notification.html | 38 + app/templates/view_experiment.html | 105 +- app/templates/view_forced_id_list.html | 49 + app/templates/view_research_notification.html | 13 + app/translations/el/LC_MESSAGES/messages.mo | Bin 0 -> 6449 bytes app/translations/el/LC_MESSAGES/messages.po | 290 +++++ app/translations/en/LC_MESSAGES/messages.mo | Bin 0 -> 4705 bytes app/translations/en/LC_MESSAGES/messages.po | 270 ++++ app/translations/fa/LC_MESSAGES/messages.mo | Bin 0 -> 5544 bytes app/translations/fa/LC_MESSAGES/messages.po | 280 +++++ app/translations/fi/LC_MESSAGES/messages.mo | Bin 0 -> 4666 bytes app/translations/fi/LC_MESSAGES/messages.po | 281 +++++ app/translations/fin/LC_MESSAGES/messages.mo | Bin 484 -> 0 bytes app/translations/fin/LC_MESSAGES/messages.po | 24 - app/translations/it/LC_MESSAGES/messages.mo | Bin 0 -> 4705 bytes app/translations/it/LC_MESSAGES/messages.po | 270 ++++ app/translations/zh/LC_MESSAGES/messages.mo | Bin 0 -> 4609 bytes app/translations/zh/LC_MESSAGES/messages.po | 270 ++++ babel.cfg | 2 +- config.py | 22 +- create_rating_db.txt | 119 ++ messages.pot | 203 ++- .../{75ace1b8b1e0_.py => aea4a0f982b4_.py} | 39 +- 51 files changed, 3467 insertions(+), 577 deletions(-) delete mode 100644 app/messages.pot create mode 100644 app/static/css/slider.css create mode 100644 app/templates/admin_dryrun.html create mode 100644 app/templates/test_page.html create mode 100644 app/templates/upload_research_notification.html create mode 100644 app/templates/view_forced_id_list.html create mode 100644 app/templates/view_research_notification.html create mode 100644 app/translations/el/LC_MESSAGES/messages.mo create mode 100644 app/translations/el/LC_MESSAGES/messages.po create mode 100644 app/translations/en/LC_MESSAGES/messages.mo create mode 100644 app/translations/en/LC_MESSAGES/messages.po create mode 100644 app/translations/fa/LC_MESSAGES/messages.mo create mode 100644 app/translations/fa/LC_MESSAGES/messages.po create mode 100644 app/translations/fi/LC_MESSAGES/messages.mo create mode 100644 app/translations/fi/LC_MESSAGES/messages.po delete mode 100644 app/translations/fin/LC_MESSAGES/messages.mo delete mode 100644 app/translations/fin/LC_MESSAGES/messages.po create mode 100644 app/translations/it/LC_MESSAGES/messages.mo create mode 100644 app/translations/it/LC_MESSAGES/messages.po create mode 100644 app/translations/zh/LC_MESSAGES/messages.mo create mode 100644 app/translations/zh/LC_MESSAGES/messages.po create mode 100644 create_rating_db.txt rename migrations/versions/{75ace1b8b1e0_.py => aea4a0f982b4_.py} (73%) diff --git a/app.db b/app.db index d1734623b4dd39f4992573f1e2ddfd7d1c1478de..0a7a1e2e1dbcbae3aead8584aa2ecce4834a8772 100644 GIT binary patch literal 122880 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 literal 94208 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 beX%A*_31bL3WakGhpxWpmqGtOuD<*q;crjN diff --git a/app/__init__.py b/app/__init__.py index b403534..00098fc 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -5,17 +5,64 @@ from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_login import LoginManager from flask_babel import Babel +from flask import request +from flask import session +from flask import flash app = Flask(__name__) -app.config['BABEL_DEFAULT_LOCALE'] = 'en' +#app.config['BABEL_DEFAULT_LOCALE'] = 'fin' +#app.config['BABEL_TRANSLATION_DIRECTORIES'] ='C:/Users/Timo/git/pet-rating/app/translations' babel = Babel(app) +@babel.localeselector +def get_locale(): + if request.args.get('lang'): + + session['lang'] = request.args.get('lang') + + if session['lang'] == 'en': + session['language'] = 'English' + + if session['lang'] == 'fi': + session['language'] = 'Finnish' + + if session['lang'] == 'fa': + session['language'] = 'Persian' + + if session['lang'] == 'el': + session['language'] = 'Greek' + + if session['lang'] == 'it': + session['language'] = 'Italian' + + if session['lang'] == 'zh': + session['language'] = 'Chinese' + + + + return session.get('lang', 'en') + + + +""" +@babel.localeselector +def get_locale(): + if session: + + return 'fi' + + else: + + return 'en' +""" +""" @babel.localeselector def get_locale(): + return request.accept_languages.best_match(app.config['LANGUAGES']) +""" - return 'fin' #mariabd mysql portti 3306 tarkista? diff --git a/app/forms.py b/app/forms.py index cbfc28b..4cf8118 100644 --- a/app/forms.py +++ b/app/forms.py @@ -5,8 +5,10 @@ from wtforms_sqlalchemy.fields import QuerySelectField from flask_bootstrap import Bootstrap from app.models import background_question from wtforms import Form, TextField, TextAreaField, SubmitField, FieldList, FormField -from wtforms import Form, BooleanField, StringField, PasswordField, validators, RadioField +from wtforms import Form, BooleanField, StringField, PasswordField, validators, RadioField, IntegerField from flask_wtf.file import FileField, FileAllowed, FileRequired +from flask_babel import _ +from flask_babel import lazy_gettext as _l class LoginForm(FlaskForm): @@ -31,13 +33,12 @@ class TaskForm(Form): class ContinueTaskForm(FlaskForm): participant_id = StringField('participant_id', validators=[DataRequired()]) - submit = SubmitField('Continue rating') - + submit = SubmitField( _l('Continue rating') ) class StartWithIdForm(FlaskForm): participant_id = StringField('participant_id', validators=[DataRequired()]) - submit = SubmitField('Start rating') + submit = SubmitField( _l('Start rating') ) class Questions(FlaskForm): @@ -80,7 +81,11 @@ class TestForm2(Form): class CreateExperimentForm(Form): name = StringField('Name', [validators.DataRequired()]) - instruction = StringField('Instruction', [validators.DataRequired()]) + creator_name = StringField('Creator_name', [validators.DataRequired()]) + single_sentence_instruction = StringField('Single_sentence_instruction', [validators.DataRequired()]) + short_instruction = TextAreaField('Short_instruction', [validators.DataRequired()]) + instruction = TextAreaField('Instruction', [validators.DataRequired()]) + consent_text = TextAreaField('Instruction', [validators.DataRequired()]) language = StringField('Language', [validators.DataRequired()]) submit = SubmitField('Send') @@ -88,10 +93,14 @@ class CreateExperimentForm(Form): class EditExperimentForm(Form): name = StringField('Name', [validators.DataRequired()]) - instruction = StringField('Instruction', [validators.DataRequired()]) + creator_name = StringField('Creator_name', [validators.DataRequired()]) + instruction = TextAreaField('Instruction', [validators.DataRequired()]) + consent_text = TextAreaField('Instruction', [validators.DataRequired()]) + short_instruction = TextAreaField('Short_instruction', [validators.DataRequired()]) + single_sentence_instruction = StringField('Single_sentece_instruction', [validators.DataRequired()]) language = SelectField('Language', choices=[ ('Afrikanns', 'Afrikanns'), ('Albanian', 'Albanian'), ('Arabic', 'Arabic'), ('Armenian', 'Armenian'), ('Basque', 'Basque'), ('Bengali', 'Bengali'), ('Bulgarian', 'Bulgarian'), - ('Catalan', 'Catalan'), ('Cambodian', 'Cambodian'), ('Chinese (Mandarin)', 'Chinese (Mandarin)'), ('Croation', 'Croation'), ('Czech', 'Czech'), ('Danish', 'Danish'), + ('Catalan', 'Catalan'), ('Cambodian', 'Cambodian'), ('Chinese', 'Chinese'), ('Croation', 'Croation'), ('Czech', 'Czech'), ('Danish', 'Danish'), ('Dutch', 'Dutch'), ('English', 'English'), ('Estonian', 'Estonian'), ('Fiji', 'Fiji'), ('Finnish', 'Finnish'), ('French', 'French'), ('Georgian', 'Georgian'), ('German', 'German'), ('Greek', 'Greek'), ('Gujarati', 'Gujarati'), ('Hebrew', 'Hebrew'), ('Hindi', 'Hindi'), ('Hungarian', 'Hungarian'), ('Icelandic', 'Icelandic'), ('Indonesian', 'Indonesian'), ('Irish', 'Irish'), ('Italian', 'Italian'), ('Japanese', 'Japanese'), ('Javanese', 'Javanese'), ('Korean', 'Korean'), ('Latin', 'Latin'), @@ -101,6 +110,9 @@ class EditExperimentForm(Form): ('Slovenian', 'Slovenian'), ('Spanish', 'Spanish'), ('Swahili', 'Swahili'), ('Swedish ', 'Swedish '), ('Tamil', 'Tamil'), ('Tatar', 'Tatar'), ('Telugu', 'Telugu'), ('Thai', 'Thai'), ('Tibetan', 'Tibetan'), ('Tonga', 'Tonga'), ('Turkish', 'Turkish'), ('Ukranian', 'Ukranian'), ('Urdu', 'Urdu'), ('Uzbek', 'Uzbek'), ('Vietnamese', 'Vietnamese'), ('Welsh', 'Welsh'), ('Xhosa', 'Xhosa')]) + stimulus_size = SelectField('Stimulus_size', choices=[ + ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'), ('9', '9'), ('10', '10'), ('11', '11'), ('12', '12')]) + submit = SubmitField('Send') @@ -137,6 +149,13 @@ class UploadStimuliForm(Form): media = TextAreaField('Media filename') file = FileField('Upload file') submit = SubmitField('Send') + + +class UploadResearchBulletinForm(Form): + + file = FileField('Upload file') + submit = SubmitField('Send') + class EditPageForm(Form): @@ -152,3 +171,9 @@ class RemoveExperimentForm(Form): remove = TextAreaField('Remove') submit = SubmitField('Send') +class GenerateIdForm(Form): + + number = IntegerField('number', [validators.DataRequired()]) + string = StringField('string', [validators.DataRequired()]) + submit = SubmitField('Submit') + diff --git a/app/messages.pot b/app/messages.pot deleted file mode 100644 index bcd5f63..0000000 --- a/app/messages.pot +++ /dev/null @@ -1,19 +0,0 @@ -# Translations template for PROJECT. -# Copyright (C) 2018 ORGANIZATION -# This file is distributed under the same license as the PROJECT project. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-11-04 17:30+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language-Team: LANGUAGE <LL@li.org>\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" - diff --git a/app/models.py b/app/models.py index 6115937..4686b98 100644 --- a/app/models.py +++ b/app/models.py @@ -1,5 +1,5 @@ from app import db -from sqlalchemy import Column, Integer, String +from sqlalchemy import Column, Integer, String, Text from flask_sqlalchemy import SQLAlchemy from flask_wtf import FlaskForm from wtforms_sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField @@ -7,6 +7,7 @@ from flask_bootstrap import Bootstrap from werkzeug.security import generate_password_hash, check_password_hash from flask_login import UserMixin from app import login +from datetime import datetime """DATABASE CLASSES""" @@ -38,14 +39,23 @@ class experiment (db.Model): __tablename__ = "experiment" idexperiment = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(120), index=True) - instruction = db.Column(db.String(120), index=True) + instruction = db.Column(db.Text, index=True) directoryname = db.Column(db.String(120), index=True, unique=True) language = db.Column(db.String(120)) status = db.Column(db.String(120)) randomization = db.Column(db.String(120)) + short_instruction = db.Column(db.Text, index=True) + single_sentence_instruction = db.Column(db.Text, index=True) + is_archived = db.Column(db.String(120)) + creator_name = db.Column(db.String(120)) + research_notification_filename = db.Column(db.String(120)) + creation_time = db.Column(db.DateTime, index=True, default=datetime.utcnow) + stimulus_size = db.Column(db.String(120)) + consent_text = db.Column(db.Text, index=True) + use_forced_id = db.Column(db.String(120)) def __repr__(self): - return "<idexperiment = '%s', name='%s', instruction='%s', directoryname='%s', language='%s', status='%s', randomization='%s'>" % (self.idexperiment, self.name, self.instruction, self.directoryname, self.language, self.status, self.randomization) + return "<idexperiment = '%s', name='%s', instruction='%s', directoryname='%s', language='%s', status='%s', randomization='%s', short_instruction='%s', single_sentence_instruction='%s', is_archived='%s', creator_name='%s', research_notification_filename='%s', creation_time='%s', stimulus_size='%s', consent_text='%s', use_forced_id='%s'>" % (self.idexperiment, self.name, self.instruction, self.directoryname, self.language, self.status, self.randomization, self.short_instruction, self.single_sentence_instruction, self.is_archived, self.creator_name, self.research_notification_filename, self.creation_time, self.stimulus_size, self.consent_text, self.use_forced_id) class answer_set (db.Model): @@ -55,9 +65,11 @@ class answer_set (db.Model): session = db.Column(db.String(120)) agreement = db.Column(db.String(120)) answer_counter = db.Column(db.Integer) + registration_time = db.Column(db.DateTime, index=True, default=datetime.utcnow) + last_answer_time = db.Column(db.DateTime, index=True, default=datetime.utcnow) def __repr__(self): - return "<idanswer_set = '%s', experiment_idexperiment = '%s', session = '%s', agreement = '%s', answer_counter = '%s'>" % (self.idanswer_set, self.experiment_idexperiment, self.session, self.agreement, self.answer_counter) + return "<idanswer_set = '%s', experiment_idexperiment = '%s', session = '%s', agreement = '%s', answer_counter = '%s', registration_time = '%s', last_answer_time = '%s'>" % (self.idanswer_set, self.experiment_idexperiment, self.session, self.agreement, self.answer_counter, self.registration_time, self.last_answer_time) class background_question_answer(db.Model): @@ -148,6 +160,21 @@ class trial_randomization (db.Model): return "<idtrial_randomization = '%s', page_idpage = '%s', randomized_idpage = '%s', answer_set_idanswer_set = '%s', experiment_idexperiment = '%s'>" % (self.idtrial_randomization, self.page_idpage, self.randomized_idpage, self.answer_set_idanswer_set, self.experiment_idexperiment) +class forced_id (db.Model): + __tablename__ = "forced_id" + idforced_id = db.Column(db.Integer, primary_key=True) + experiment_idexperiment = db.Column(db.Integer, db.ForeignKey('experiment.idexperiment')) + pregenerated_id = db.Column(db.String(120)) + + def __repr__(self): + return "<idforced_id = '%s', experiment_idexperiment = '%s', pregenerated_id = '%s'>" % (self.idforced_id, self.experiment_idexperiment, self.pregenerated_id) + + + + + + + class user(UserMixin, db.Model): __tablename__ = "user" id = db.Column(db.Integer, primary_key=True) diff --git a/app/rating_tool.py b/app/rating_tool.py index 5223f6e..0592181 100644 --- a/app/rating_tool.py +++ b/app/rating_tool.py @@ -4,7 +4,7 @@ from app.models import experiment from app.models import answer_set from app.models import background_question_answer from app.models import question, page, answer -from app.models import user, trial_randomization +from app.models import user, trial_randomization, forced_id @@ -20,10 +20,12 @@ def make_shell_context(): 'page': page, 'answer': answer, 'user': user, - 'trial_randomization': trial_randomization + 'trial_randomization': trial_randomization, + 'forced_id': forced_id } + """ from app import app, db diff --git a/app/routes.py b/app/routes.py index 394a89e..991bb63 100644 --- a/app/routes.py +++ b/app/routes.py @@ -4,7 +4,7 @@ from app.models import background_question, experiment from app.models import background_question_answer from app.models import page, question from app.models import background_question_option -from app.models import answer_set, answer +from app.models import answer_set, answer, forced_id from flask import session from app.forms import LoginForm, RegisterForm from flask import flash, redirect @@ -27,7 +27,7 @@ from flask_login import login_required from sqlalchemy import update from app.forms import StartWithIdForm import secrets -from app.forms import CreateExperimentForm, CreateBackgroundQuestionForm, CreateQuestionForm, UploadStimuliForm, EditBackgroundQuestionForm, EditQuestionForm, EditExperimentForm +from app.forms import CreateExperimentForm, CreateBackgroundQuestionForm, CreateQuestionForm, UploadStimuliForm, EditBackgroundQuestionForm, EditQuestionForm, EditExperimentForm, UploadResearchBulletinForm from app.forms import EditPageForm, RemoveExperimentForm import os import random @@ -40,8 +40,11 @@ from flask import send_file from flask import make_response from flask_babel import Babel from app import babel - - +from datetime import datetime +from app.forms import GenerateIdForm +import math +from flask_babel import _ +from flask_babel import lazy_gettext as _l #Stimuli upload folder setting APP_ROOT = os.path.dirname(os.path.abspath(__file__)) @@ -61,8 +64,8 @@ def index(): else: - flash("set lang") - session['language'] = "All" + #flash("sessio ei voimassa") + session['language'] = "English" return render_template('index.html', title='Home', experiments=experiments) @@ -70,8 +73,21 @@ def index(): @app.route('/consent') def consent(): exp_id = request.args.get('exp_id', None) - experiments = experiment.query.all() - return render_template('consent.html', exp_id=exp_id, experiments=experiments) + + experiment_info = experiment.query.filter_by(idexperiment=exp_id).first() + + + + + + if experiment_info.use_forced_id == 'On': + + return redirect(url_for('begin_with_id', exp_id=exp_id)) + + + + + return render_template('consent.html', exp_id=exp_id, experiment_info=experiment_info) @app.route('/set_language') @@ -79,10 +95,10 @@ def set_language(): session['language'] = request.args.get('language', None) + lang = request.args.get('lang', None) - - return redirect(url_for('index')) + return redirect(url_for('index', lang=lang)) @app.route('/remove_language') def remove_language(): @@ -131,7 +147,9 @@ def participant_session(): #create answer set for the participant in the database - participant_answer_set = answer_set(experiment_idexperiment=session['exp_id'], session=session['user'], agreement = session['agree'], answer_counter = '0') + the_time = datetime.now() + the_time = the_time.replace(microsecond=0) + participant_answer_set = answer_set(experiment_idexperiment=session['exp_id'], session=session['user'], agreement = session['agree'], answer_counter = '0', registration_time=the_time, last_answer_time=the_time) db.session.add(participant_answer_set) db.session.commit() @@ -333,6 +351,46 @@ def begin_with_id(): exp_id = request.args.get('exp_id', None) form = StartWithIdForm() + experiment_info = experiment.query.filter_by(idexperiment=exp_id).first() + + if form.validate_on_submit(): + + variable = form.participant_id.data + + #check if participant ID is found from db with this particular ID. If a match is found inform about error + participant = answer_set.query.filter(and_(answer_set.session==variable, answer_set.experiment_idexperiment==exp_id)).first() + is_id_valid = forced_id.query.filter(and_(forced_id.pregenerated_id==variable, forced_id.experiment_idexperiment==exp_id)).first() + + if participant is not None: + flash(_('ID already in use')) + return redirect(url_for('begin_with_id', exp_id=exp_id)) + + #if there was not a participant already in DB: + if participant is None: + + if is_id_valid is None: + + + flash(_('No such ID set for this experiment')) + return redirect(url_for('begin_with_id', exp_id=exp_id)) + + else: + + #save the participant ID in session list for now, this is deleted after the session has been started in participant_session-view + session['begin_with_id'] = form.participant_id.data + return render_template('consent.html', exp_id=exp_id, experiment_info=experiment_info) + + return render_template('begin_with_id.html', exp_id=exp_id, form=form) + + +@app.route('/admin_dryrun', methods=['GET', 'POST']) +@login_required +def admin_dryrun(): + + + exp_id = request.args.get('exp_id', None) + form = StartWithIdForm() + experiment_info = experiment.query.filter_by(idexperiment=exp_id).first() if form.validate_on_submit(): @@ -340,16 +398,17 @@ def begin_with_id(): participant = answer_set.query.filter(and_(answer_set.session==form.participant_id.data, answer_set.experiment_idexperiment==exp_id)).first() if participant is not None: flash('ID already in use') - return redirect(url_for('begin_with_id', exp_id=exp_id)) + return redirect(url_for('admin_dryrun', exp_id=exp_id)) #if there was not a participant already in DB: if participant is None: #save the participant ID in session list for now, this is deleted after the session has been started in participant_session-view session['begin_with_id'] = form.participant_id.data - return render_template('consent.html', exp_id=exp_id) + return render_template('consent.html', exp_id=exp_id, experiment_info=experiment_info) - return render_template('begin_with_id.html', exp_id=exp_id, form=form) + return render_template('admin_dryrun.html', exp_id=exp_id, form=form) + @app.route('/create_task') @@ -368,6 +427,15 @@ def instructions(): @app.route('/task/<int:page_num>', methods=['GET', 'POST']) def task(page_num): + + experiment_info = experiment.query.filter_by(idexperiment=session['exp_id']).first() + rating_instruction = experiment_info.single_sentence_instruction + stimulus_size = experiment_info.stimulus_size + + #for text stimuli the size needs to be calculated since the template element utilises h1-h6 tags. + #A value of stimulus size 12 gives h1 and value of 1 gives h6 + stimulus_size_text = 7-math.ceil((int(stimulus_size)/2)) + pages = page.query.filter_by(experiment_idexperiment=session['exp_id']).paginate(per_page=1, page=page_num, error_out=True) progress_bar_percentage = round((pages.page/pages.pages)*100) @@ -424,11 +492,15 @@ def task(page_num): - if check_answer is None: + if check_answer is None: + + the_time = datetime.now() + the_time = the_time.replace(microsecond=0) update_answer_counter = answer_set.query.filter_by(idanswer_set=session['answer_set']).first() update_answer_counter.answer_counter = int(update_answer_counter.answer_counter) + 1 - + update_answer_counter.last_answer_time = the_time + #flash("vastauksia:") #flash(update_answer_counter.answer_counter) db.session.commit() @@ -471,7 +543,7 @@ def task(page_num): return redirect ( url_for('task_completed')) - return render_template('task.html', pages=pages, progress_bar_percentage=progress_bar_percentage, form=form, randomized_stimulus=randomized_stimulus) + return render_template('task.html', pages=pages, progress_bar_percentage=progress_bar_percentage, form=form, randomized_stimulus=randomized_stimulus, rating_instruction=rating_instruction, stimulus_size=stimulus_size, stimulus_size_text=stimulus_size_text) @@ -491,7 +563,7 @@ def quit_task(): @app.route('/researcher_login', methods=['GET', 'POST']) def login(): if current_user.is_authenticated: - flash("allready logged in") + #flash("allready logged in") return redirect(url_for('index')) form = LoginForm() if form.validate_on_submit(): @@ -523,41 +595,128 @@ def experiment_statistics(): experiment_info = experiment.query.filter_by(idexperiment = exp_id).all() participants = answer_set.query.filter_by(experiment_idexperiment= exp_id).all() - participants_and_answers = {} - for participant in participants: - - answers = answer.query.filter_by(answer_set_idanswer_set=participant.idanswer_set).all() - answers_list = [(a.idanswer, a.question_idquestion, a.answer_set_idanswer_set, a.answer, a.page_idpage) for a in answers] - participants_and_answers[participant.session] = answers_list + #Rating task headers + question_headers = question.query.filter_by(experiment_idexperiment=exp_id).all() + stimulus_headers = page.query.filter_by(experiment_idexperiment=exp_id).all() + + pages = page.query.filter_by(experiment_idexperiment=exp_id).all() + questions = question.query.filter_by(experiment_idexperiment=exp_id).all() pages_and_questions = {} for p in pages: - questions = question.query.filter_by(experiment_idexperiment=exp_id).all() - questions_list = [(p.idpage, a.question) for a in questions] + questions_list = [(p.idpage, a.idquestion) for a in questions] pages_and_questions[p.idpage] = questions_list + + + + + #List of answers per participant in format question Stimulus ID/Question ID + #those are in answer table as page_idpage and question_idquestion respectively + + + + """ + pages = page.query.filter_by(experiment_idexperiment=exp_id).all() + + participants_and_answers = {} + + #participants on kaikki expin osallistujat + for participant in participants: + + + #kaikki yhden khn vastaukset ko experimentille koska answer_setin id matchaa answereiden kanssa + + + flash(participant.session) + for p in pages: + answers = answer.query.filter_by(answer_set_idanswer_set=participant.idanswer_set).all() + #kaikki yhden participantin vastaukset pagelle + answers_for_page = answer.query.filter(and_(answer.answer_set_idanswer_set==participant.idanswer_set, answer.page_idpage==p.idpage)).all() + + + for ans in answers: + + + + if ans.page_idpage == p.idpage: + + #flash(ans.page_idpage) + flash("X") + + + + + else: + + flash("NA") + + #pages on kaikki experimentin paget + + + + for a in answers: + + if p.idpage == a.page_idpage: + flash("match") + + else: + flash("no match") + flash("participant:") + flash(participant.session) + flash("stimulus:") + flash(a.page_idpage) + flash("Kysymys") + flash(a.question_idquestion) + flash("vastaus:") + flash(a.answer) + + + + + #answers_list = (a.idanswer, a.question_idquestion, a.answer_set_idanswer_set, a.answer, a.page_idpage) + + #participants_and_answers[participant.session] = answers_list + + + """ + + participants_and_answers = {} + + for participant in participants: + + answers = answer.query.filter_by(answer_set_idanswer_set=participant.idanswer_set).all() + answers_list = [(a.idanswer, a.question_idquestion, a.answer_set_idanswer_set, a.answer, a.page_idpage) for a in answers] + participants_and_answers[participant.session] = answers_list + + + + #Background question answers bg_questions = background_question.query.filter_by(experiment_idexperiment=exp_id).all() bg_answers_for_participants = {} - + for participant in participants: bg_answers = background_question_answer.query.filter_by(answer_set_idanswer_set=participant.idanswer_set).all() bg_answers_list = [(a.answer) for a in bg_answers] bg_answers_for_participants[participant.session] = bg_answers_list - + + #started and finished ratings counters started_ratings = answer_set.query.filter_by(experiment_idexperiment=exp_id).count() + experiment_page_count = page.query.filter_by(experiment_idexperiment=exp_id).count() + finished_ratings = answer_set.query.filter(and_(answer_set.answer_counter==experiment_page_count, answer_set.experiment_idexperiment==exp_id)).count() - return render_template('experiment_statistics.html', experiment_info=experiment_info, participants_and_answers=participants_and_answers, pages_and_questions=pages_and_questions, bg_questions=bg_questions, bg_answers_for_participants=bg_answers_for_participants, started_ratings=started_ratings) + return render_template('experiment_statistics.html', experiment_info=experiment_info, participants_and_answers=participants_and_answers, pages_and_questions=pages_and_questions, bg_questions=bg_questions, bg_answers_for_participants=bg_answers_for_participants, started_ratings=started_ratings, finished_ratings=finished_ratings, question_headers=question_headers, stimulus_headers=stimulus_headers) @@ -572,7 +731,11 @@ def create_experiment(): if request.method == 'POST' and form.validate(): - new_exp = experiment(name=request.form['name'], instruction=request.form['instruction'], language=request.form['language'], status='Hidden', randomization='Off') + + the_time = datetime.now() + the_time = the_time.replace(microsecond=0) + + new_exp = experiment(name=request.form['name'], instruction=request.form['instruction'], language=request.form['language'], status='Hidden', randomization='Off', single_sentence_instruction=request.form['single_sentence_instruction'], short_instruction=request.form['short_instruction'], creator_name=request.form['creator_name'], is_archived='False', creation_time=the_time, stimulus_size='7', consent_text=request.form['consent_text'], use_forced_id='Off') db.session.add(new_exp) db.session.commit() @@ -671,27 +834,33 @@ def create_experiment_questions(): list = str_list[a].split(';') - #If there are the right amount of values for the slider input values - if len(list) == 3: - - #flash("Question:") - #flash(list[0]) - #flash("Left:") - #flash(list[1]) - #flash("Right:") - #flash(list[2]) - - add_question = question(experiment_idexperiment=exp_id, question=list[0], left=list[1], right=list[2]) - db.session.add(add_question) - db.session.commit() - - - #If slider has too many or too litlle parameters give an error and redirect back to input form - else: + #If there are the wrong amount of values for any of the the slider input values + #redirect back to the form + if len(list) != 3: + + flash("Error Each slider must have 3 parameters separated by ; Some slider has:") flash(len(list)) return redirect(url_for('create_experiment_questions', exp_id=exp_id)) + + #If all the slider inputs were of length 3 items + #we can input them to db + for a in range(len(str_list)): + + list = str_list[a].split(';') + + #flash("Question:") + #flash(list[0]) + #flash("Left:") + #flash(list[1]) + #flash("Right:") + #flash(list[2]) + + add_question = question(experiment_idexperiment=exp_id, question=list[0], left=list[1], right=list[2]) + db.session.add(add_question) + db.session.commit() + return redirect(url_for('create_experiment_upload_stimuli', exp_id=exp_id)) @@ -788,7 +957,7 @@ def view_experiment(): #crap:3lines exp_id = request.args.get('exp_id', None) - media = page.query.filter_by(experiment_idexperiment=exp_id).paginate(per_page=20, page=1, error_out=True) + media = page.query.filter_by(experiment_idexperiment=exp_id).all() mtype = page.query.filter_by(experiment_idexperiment=exp_id).first() #experiment info @@ -950,41 +1119,53 @@ def edit_question(): def add_bg_question(): exp_id = request.args.get('exp_id', None) - form = CreateBackgroundQuestionForm(request.form) + exp_status = experiment.query.filter_by(idexperiment=exp_id).first() + + if exp_status.status == 'Public': - if request.method == 'POST' and form.validate(): - - str = form.bg_questions_and_options.data + flash("Experiment is public. Cannot modify structure.") - #Split the form data into a list that separates questions followed by the corresponding options - str_list = str.split('/n') + return redirect(url_for('view_experiment', exp_id=exp_id)) + + else: - #Iterate through the questions and options list - for a in range(len(str_list)): - #Split the list cells further into questions and options - list = str_list[a].split(';') - #Input the first item of the list as a question in db and the items followed by that as options for that question - for x in range(len(list)): - - if x == 0: - #flash("Kysymys") - #flash(list[x]) - add_bgquestion = background_question(background_question=list[x], experiment_idexperiment=exp_id) - db.session.add(add_bgquestion) - db.session.commit() - - else: - #flash("optio") - #flash(list[x]) - add_bgq_option = background_question_option(background_question_idbackground_question=add_bgquestion.idbackground_question, option=list[x]) - db.session.add(add_bgq_option) - db.session.commit() + form = CreateBackgroundQuestionForm(request.form) - return redirect(url_for('view_experiment', exp_id=exp_id)) - - return render_template('add_bg_question.html', form=form) + if request.method == 'POST' and form.validate(): + + str = form.bg_questions_and_options.data + + #Split the form data into a list that separates questions followed by the corresponding options + str_list = str.split('/n') + + #Iterate through the questions and options list + for a in range(len(str_list)): + + #Split the list cells further into questions and options + list = str_list[a].split(';') + + #Input the first item of the list as a question in db and the items followed by that as options for that question + for x in range(len(list)): + + if x == 0: + #flash("Kysymys") + #flash(list[x]) + add_bgquestion = background_question(background_question=list[x], experiment_idexperiment=exp_id) + db.session.add(add_bgquestion) + db.session.commit() + + else: + #flash("optio") + #flash(list[x]) + add_bgq_option = background_question_option(background_question_idbackground_question=add_bgquestion.idbackground_question, option=list[x]) + db.session.add(add_bgq_option) + db.session.commit() + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + return render_template('add_bg_question.html', form=form) @@ -993,41 +1174,51 @@ def add_bg_question(): def add_questions(): exp_id = request.args.get('exp_id', None) - form = CreateQuestionForm(request.form) - - if request.method == 'POST' and form.validate(): - - str = form.questions_and_options.data - str_list = str.split('/n') + exp_status = experiment.query.filter_by(idexperiment=exp_id).first() - for a in range(len(str_list)): + if exp_status.status == 'Public': + + flash("Experiment is public. Cannot modify structure.") - list = str_list[a].split(';') - - #If there are the right amount of values for the slider input values - if len(list) == 3: - - #flash("Question:") - #flash(list[0]) - #flash("Left:") - #flash(list[1]) - #flash("Right:") - #flash(list[2]) - - add_question = question(experiment_idexperiment=exp_id, question=list[0], left=list[1], right=list[2]) - db.session.add(add_question) - db.session.commit() - - #If slider has too many or too litlle parameters give an error and redirect back to input form - else: - flash("Error Each slider must have 3 parameters separated by ; Some slider has:") - flash(len(list)) - - return redirect(url_for('create_experiment_questions', exp_id=exp_id)) + return redirect(url_for('view_experiment', exp_id=exp_id)) - return redirect(url_for('view_experiment', exp_id=exp_id)) - - return render_template('add_questions.html', form=form) + else: + + form = CreateQuestionForm(request.form) + + if request.method == 'POST' and form.validate(): + + str = form.questions_and_options.data + str_list = str.split('/n') + + for a in range(len(str_list)): + + list = str_list[a].split(';') + + #If there are the right amount of values for the slider input values + if len(list) == 3: + + #flash("Question:") + #flash(list[0]) + #flash("Left:") + #flash(list[1]) + #flash("Right:") + #flash(list[2]) + + add_question = question(experiment_idexperiment=exp_id, question=list[0], left=list[1], right=list[2]) + db.session.add(add_question) + db.session.commit() + + #If slider has too many or too litlle parameters give an error and redirect back to input form + else: + flash("Error Each slider must have 3 parameters separated by ; Some slider has:") + flash(len(list)) + + return redirect(url_for('create_experiment_questions', exp_id=exp_id)) + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + return render_template('add_questions.html', form=form) @@ -1039,22 +1230,35 @@ def add_questions(): def remove_bg_question(): exp_id = request.args.get('exp_id', None) - remove_id = request.args.get('idbackground_question', None) - - remove_options = background_question_option.query.filter_by(background_question_idbackground_question=remove_id).all() + + + exp_status = experiment.query.filter_by(idexperiment=exp_id).first() + + if exp_status.status == 'Public': - for a in range(len(remove_options)): + flash("Experiment is public. Cannot modify structure.") + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + else: - #flash(remove_options[a].idbackground_question_option) - db.session.delete(remove_options[a]) - db.session.commit() - + remove_id = request.args.get('idbackground_question', None) + + remove_options = background_question_option.query.filter_by(background_question_idbackground_question=remove_id).all() - remove_question = background_question.query.filter_by(idbackground_question=remove_id).first() + for a in range(len(remove_options)): + + #flash(remove_options[a].idbackground_question_option) + + db.session.delete(remove_options[a]) + db.session.commit() - db.session.delete(remove_question) - db.session.commit() + + remove_question = background_question.query.filter_by(idbackground_question=remove_id).first() + + db.session.delete(remove_question) + db.session.commit() return redirect(url_for('view_experiment', exp_id=exp_id)) @@ -1066,12 +1270,22 @@ def remove_bg_question(): def remove_question(): exp_id = request.args.get('exp_id', None) - remove_id = request.args.get('idquestion', None) - - remove_question = question.query.filter_by(idquestion=remove_id).first() + exp_status = experiment.query.filter_by(idexperiment=exp_id).first() + + if exp_status.status == 'Public': - db.session.delete(remove_question) - db.session.commit() + flash("Experiment is public. Cannot modify structure.") + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + else: + + + remove_id = request.args.get('idquestion', None) + remove_question = question.query.filter_by(idquestion=remove_id).first() + + db.session.delete(remove_question) + db.session.commit() return redirect(url_for('view_experiment', exp_id=exp_id)) @@ -1081,121 +1295,153 @@ def remove_question(): def remove_experiment(): exp_id = request.args.get('exp_id', None) + exp_status = experiment.query.filter_by(idexperiment=exp_id).first() + + if exp_status.status == 'Public': - form = RemoveExperimentForm(request.form) - - if request.method == 'POST' and form.validate(): + flash("Experiment is public. Cannot modify structure.") - if form.remove.data == 'DELETE': + return redirect(url_for('view_experiment', exp_id=exp_id)) + + else: - - #This removes all experiment data from the database! - - - #Tables - - #background_question_option & background_question & background question answers: - remove_background_question = background_question.query.filter_by(experiment_idexperiment=exp_id).all() - - #cycle through all bg questions and delete their options - for a in range(len(remove_background_question)): - - remove_background_question_option = background_question_option.query.filter_by(background_question_idbackground_question=remove_background_question[a].idbackground_question).all() - - for b in range(len(remove_background_question_option)): - - db.session.delete(remove_background_question_option[b]) - db.session.commit() - - - #Remove all background questions and all answers given to each bg question - for a in range(len(remove_background_question)): - - remove_background_question_answers = background_question_answer.query.filter_by(background_question_idbackground_question=remove_background_question[a].idbackground_question).all() + + + form = RemoveExperimentForm(request.form) + + if request.method == 'POST' and form.validate(): + + if form.remove.data == 'DELETE': + - for b in range(len(remove_background_question_answers)): - - db.session.delete(remove_background_question_answers[b]) - db.session.commit() + #This removes all experiment data from the database! - db.session.delete(remove_background_question[a]) - db.session.commit() + #Remove research bulletin if it exists + empty_filevariable = experiment.query.filter_by(idexperiment=exp_id).first() + + if empty_filevariable.research_notification_filename is not None: + + target = os.path.join(APP_ROOT, empty_filevariable.research_notification_filename) + + if os.path.exists(target): + os.remove(target) + + + + + #Tables + + + remove_forced_id = forced_id.query.filter_by(experiment_idexperiment=exp_id).all() + + for b in range(len(remove_forced_id)): + db.session.delete(remove_forced_id[b]) + db.session.commit() - - #Remove all questions and answers - remove_question = question.query.filter_by(experiment_idexperiment=exp_id).all() - - for a in range(len(remove_question)): - remove_question_answers = answer.query.filter_by(question_idquestion=remove_question[a].idquestion).all() + #background_question_option & background_question & background question answers: + remove_background_question = background_question.query.filter_by(experiment_idexperiment=exp_id).all() - for b in range(len(remove_question_answers)): + #cycle through all bg questions and delete their options + for a in range(len(remove_background_question)): + + remove_background_question_option = background_question_option.query.filter_by(background_question_idbackground_question=remove_background_question[a].idbackground_question).all() + + for b in range(len(remove_background_question_option)): + + db.session.delete(remove_background_question_option[b]) + db.session.commit() + + + #Remove all background questions and all answers given to each bg question + for a in range(len(remove_background_question)): + + remove_background_question_answers = background_question_answer.query.filter_by(background_question_idbackground_question=remove_background_question[a].idbackground_question).all() - db.session.delete(remove_question_answers[b]) + for b in range(len(remove_background_question_answers)): + + db.session.delete(remove_background_question_answers[b]) + db.session.commit() + + db.session.delete(remove_background_question[a]) db.session.commit() - - db.session.delete(remove_question[a]) - db.session.commit() - - - #Remove all pages and datafiles - remove_pages = page.query.filter_by(experiment_idexperiment=exp_id).all() - - for a in range(len(remove_pages)): - - if remove_pages[a].type == 'text': + + + #Remove all questions and answers + remove_question = question.query.filter_by(experiment_idexperiment=exp_id).all() + + for a in range(len(remove_question)): + + remove_question_answers = answer.query.filter_by(question_idquestion=remove_question[a].idquestion).all() + + for b in range(len(remove_question_answers)): + + db.session.delete(remove_question_answers[b]) + db.session.commit() + + db.session.delete(remove_question[a]) + db.session.commit() + + + #Remove all pages and datafiles + remove_pages = page.query.filter_by(experiment_idexperiment=exp_id).all() + + for a in range(len(remove_pages)): + + if remove_pages[a].type == 'text': + + db.session.delete(remove_pages[a]) + db.session.commit() + + else: + + target = os.path.join(APP_ROOT, remove_pages[a].media) + + if os.path.exists(target): + os.remove(target) + + #Now that the files are removed we can delete the page db.session.delete(remove_pages[a]) db.session.commit() - else: - target = os.path.join(APP_ROOT, remove_pages[a].media) - - if os.path.exists(target): - os.remove(target) + #Remove all answer_sets and trial_randomization orders + remove_answer_set = answer_set.query.filter_by(experiment_idexperiment=exp_id).all() + + for a in range(len(remove_answer_set)): + + remove_trial_randomizations = trial_randomization.query.filter_by(answer_set_idanswer_set=remove_answer_set[a].idanswer_set).all() + + for b in range(len(remove_trial_randomizations)): + + db.session.delete(remove_trial_randomizations[b]) + db.session.commit() + + db.session.delete(remove_answer_set[a]) + db.session.commit() - #Now that the files are removed we can delete the page - db.session.delete(remove_pages[a]) + + #Remove experiment table + remove_experiment = experiment.query.filter_by(idexperiment=exp_id).first() + db.session.delete(remove_experiment) db.session.commit() - #Remove all answer_sets and trial_randomization orders - remove_answer_set = answer_set.query.filter_by(experiment_idexperiment=exp_id).all() - - for a in range(len(remove_answer_set)): + flash("Experiment was removed from database!") - remove_trial_randomizations = trial_randomization.query.filter_by(answer_set_idanswer_set=remove_answer_set[a].idanswer_set).all() + return redirect(url_for('index')) - for b in range(len(remove_trial_randomizations)): - - db.session.delete(remove_trial_randomizations[b]) - db.session.commit() + else: + + flash("Experiment was not removed!") + + return redirect(url_for('view_experiment', exp_id=exp_id)) - db.session.delete(remove_answer_set[a]) - db.session.commit() - - - #Remove experiment table - remove_experiment = experiment.query.filter_by(idexperiment=exp_id).first() - db.session.delete(remove_experiment) - db.session.commit() - - - flash("Experiment was removed from database!") - - return redirect(url_for('index')) - - else: - - flash("Experiment was not removed!") - - return redirect(url_for('view_experiment', exp_id=exp_id)) - - - return render_template('remove_experiment.html', form=form, exp_id=exp_id) + + return render_template('remove_experiment.html', form=form, exp_id=exp_id) @@ -1204,48 +1450,59 @@ def remove_experiment(): def remove_page(): exp_id = request.args.get('exp_id', None) - remove_id = request.args.get('idpage', None) - remove_page = page.query.filter_by(idpage=remove_id).first() - experiment_pages = page.query.filter_by(experiment_idexperiment=exp_id).all() + exp_status = experiment.query.filter_by(idexperiment=exp_id).first() + + if exp_status.status == 'Public': - #if stimulustype is text, the stimulus itself is text on the database, other stimulus types are real files - #on the server and need to be deleted - if remove_page.type != 'text': + flash("Experiment is public. Cannot modify structure.") + + return redirect(url_for('view_experiment', exp_id=exp_id)) - #helper variable - do_not_delete_file = 'False' - - #if the file to be deleted is in duplicate use of another page then we won't delete the file - for a in range(len(experiment_pages)): + else: - #flash("in da for") + + remove_id = request.args.get('idpage', None) + remove_page = page.query.filter_by(idpage=remove_id).first() + experiment_pages = page.query.filter_by(experiment_idexperiment=exp_id).all() + + #if stimulustype is text, the stimulus itself is text on the database, other stimulus types are real files + #on the server and need to be deleted + if remove_page.type != 'text': + + #helper variable + do_not_delete_file = 'False' - if experiment_pages[a].media == remove_page.media and experiment_pages[a].idpage != remove_page.idpage: - - #flash("in da if") - do_not_delete_file = 'True' - - #If no other page is using the file then lets remove it - if do_not_delete_file == 'False': - #remove old file - target = os.path.join(APP_ROOT, remove_page.media) - #flash("Remove:") - #flash(target) - os.remove(target) + #if the file to be deleted is in duplicate use of another page then we won't delete the file + for a in range(len(experiment_pages)): - db.session.delete(remove_page) - db.session.commit() - - return redirect(url_for('view_experiment', exp_id=exp_id)) + #flash("in da for") + + if experiment_pages[a].media == remove_page.media and experiment_pages[a].idpage != remove_page.idpage: - if remove_page.type == 'text': + #flash("in da if") + do_not_delete_file = 'True' + + #If no other page is using the file then lets remove it + if do_not_delete_file == 'False': + #remove old file + target = os.path.join(APP_ROOT, remove_page.media) + #flash("Remove:") + #flash(target) + os.remove(target) - db.session.delete(remove_page) - db.session.commit() + db.session.delete(remove_page) + db.session.commit() + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + if remove_page.type == 'text': + + db.session.delete(remove_page) + db.session.commit() + + return redirect(url_for('view_experiment', exp_id=exp_id)) return redirect(url_for('view_experiment', exp_id=exp_id)) - - return redirect(url_for('view_experiment', exp_id=exp_id)) @app.route('/publish_experiment') @@ -1316,6 +1573,96 @@ def disable_randomization(): return redirect(url_for('view_experiment', exp_id=exp_id)) +@app.route('/enable_forced_id') +@login_required +def enable_forced_id(): + + exp_id = request.args.get('exp_id', None) + + enable_forced_id = experiment.query.filter_by(idexperiment = exp_id).first() + + enable_forced_id.use_forced_id = 'On' + + flash("Enabled forced ID login") + + db.session.commit() + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + +@app.route('/disable_forced_id') +@login_required +def disable_forced_id(): + + exp_id = request.args.get('exp_id', None) + + disable_forced_id = experiment.query.filter_by(idexperiment = exp_id).first() + + disable_forced_id.use_forced_id = 'Off' + + flash("Disabled forced ID login") + + db.session.commit() + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + +@app.route('/view_forced_id_list', methods=['GET', 'POST']) +@login_required +def view_forced_id_list(): + + exp_id = request.args.get('exp_id', None) + + id_list = forced_id.query.filter_by(experiment_idexperiment=exp_id).all() + + + form = GenerateIdForm(request.form) + + if request.method == 'POST' and form.validate(): + + + for i in range(int(request.form['number'])): + + random_id = str(request.form['string']) + str(secrets.token_hex(3)) + check_answer_set = answer_set.query.filter_by(session=random_id).first() + check_forced_id = forced_id.query.filter_by(pregenerated_id=random_id).first() + + + #here we check if the generated id is found from given answers from the whole database in answer_set table + #or from forced_id table. If so another id is generated instead to avoid a duplicate + if check_answer_set is not None or check_forced_id is not None: + + #flash("ID already existed; generated a new one") + random_id = secrets.token_hex(3) + check_answer_set = answer_set.query.filter_by(session=random_id).first() + check_forced_id = forced_id.query.filter_by(pregenerated_id=random_id).first() + + input_id = forced_id(experiment_idexperiment=exp_id, pregenerated_id=random_id) + db.session.add(input_id) + db.session.commit() + + + + + return redirect(url_for('view_forced_id_list', exp_id=exp_id)) + + + + + + + + return render_template('view_forced_id_list.html', exp_id=exp_id, id_list=id_list) + + + + + + + + + + @app.route('/edit_stimuli', methods=['GET', 'POST']) @login_required def edit_stimuli(): @@ -1395,79 +1742,194 @@ def edit_stimuli(): def add_stimuli(): exp_id = request.args.get('exp_id', None) - stimulus_type = request.args.get('stimulus_type', None) - - form = UploadStimuliForm(request.form) + + + exp_status = experiment.query.filter_by(idexperiment=exp_id).first() - if request.method == 'POST': - - if stimulus_type == 'text': - - #flash("db insert text") - - string = form.text.data - str_list = string.split('/n') + if exp_status.status == 'Public': + + flash("Experiment is public. Cannot modify structure.") - for a in range(len(str_list)): + return redirect(url_for('view_experiment', exp_id=exp_id)) + + else: - #flash("lisättiin:") - #flash(str_list[a]) - add_text_stimulus = page(experiment_idexperiment=exp_id, type='text', text=str_list[a], media='none') - db.session.add(add_text_stimulus) - db.session.commit() - #flash("Succes!") - - return redirect(url_for('view_experiment', exp_id=exp_id)) - - + #If there are no pages set for the experiment lets reroute user to create experiment stimuli upload instead + + is_there_any_stimuli = page.query.filter_by(experiment_idexperiment = exp_id).first() + + if is_there_any_stimuli is None: - else: + return redirect(url_for('create_experiment_upload_stimuli', exp_id=exp_id)) - #Upload stimuli into /static/experiment_stimuli/exp_id folder - #Create the pages for the stimuli by inserting experiment_id, stimulus type, text and names of the stimulus files (as a path to the folder) - path = 'static/experiment_stimuli/' + str(exp_id) - - target = os.path.join(APP_ROOT, path) - #flash(target) - - if not os.path.isdir(target): - os.mkdir(target) - #flash("make dir") - #This returns a list of filenames: request.files.getlist("file") + stimulus_type = request.args.get('stimulus_type', None) + + form = UploadStimuliForm(request.form) + + if request.method == 'POST': - for file in request.files.getlist("file"): - #save files in the correct folder - #flash(file.filename) - filename = file.filename - destination = "/".join([target, filename]) - #flash("destination") - #flash(destination) - file.save(destination) - - #add pages to the db - db_path = path + str('/') + str(filename) - - #flash("db path") - #flash(db_path) + if stimulus_type == 'text': + + #flash("db insert text") - new_page = page(experiment_idexperiment=exp_id, type=form.type.data, media=db_path) + string = form.text.data + str_list = string.split('/n') + + for a in range(len(str_list)): + + #flash("lisättiin:") + #flash(str_list[a]) + add_text_stimulus = page(experiment_idexperiment=exp_id, type='text', text=str_list[a], media='none') + db.session.add(add_text_stimulus) + db.session.commit() + + #flash("Succes!") + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + + + else: + + #Upload stimuli into /static/experiment_stimuli/exp_id folder + #Create the pages for the stimuli by inserting experiment_id, stimulus type, text and names of the stimulus files (as a path to the folder) + path = 'static/experiment_stimuli/' + str(exp_id) + + target = os.path.join(APP_ROOT, path) + #flash(target) - db.session.add(new_page) - db.session.commit() + if not os.path.isdir(target): + os.mkdir(target) + #flash("make dir") + + + #This returns a list of filenames: request.files.getlist("file") + + for file in request.files.getlist("file"): - #flash("Succes!") + #save files in the correct folder + #flash(file.filename) + filename = file.filename + destination = "/".join([target, filename]) + #flash("destination") + #flash(destination) + file.save(destination) + + #add pages to the db + db_path = path + str('/') + str(filename) + + #flash("db path") + #flash(db_path) + + new_page = page(experiment_idexperiment=exp_id, type=form.type.data, media=db_path) + + db.session.add(new_page) + db.session.commit() + + #flash("Succes!") + + return redirect(url_for('view_experiment', exp_id=exp_id)) return redirect(url_for('view_experiment', exp_id=exp_id)) - return redirect(url_for('view_experiment', exp_id=exp_id)) + + return render_template('add_stimuli.html', form=form, stimulus_type=stimulus_type) + + + +@app.route('/upload_research_notification', methods=['GET', 'POST']) +@login_required +def upload_research_notification(): + + exp_id = request.args.get('exp_id', None) + + form = UploadResearchBulletinForm(request.form) + + if request.method == 'POST': + + path = 'static/experiment_stimuli/' + str(exp_id) + + target = os.path.join(APP_ROOT, path) + #flash(target) + + if not os.path.isdir(target): + os.mkdir(target) + #flash("make dir") + + + #This returns a list of filenames: request.files.getlist("file") + + for file in request.files.getlist("file"): - - return render_template('add_stimuli.html', form=form, stimulus_type=stimulus_type) + #save files in the correct folder + #flash(file.filename) + filename = file.filename + destination = "/".join([target, filename]) + #flash("destination") + #flash(destination) + file.save(destination) + + #add pages to the db + db_path = path + str('/') + str(filename) + + #flash("db path") + #flash(db_path) + + + bulletin = experiment.query.filter_by(idexperiment=exp_id).first() + + bulletin.research_notification_filename = db_path + db.session.commit() + + #flash("Succes!") + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + + return render_template('upload_research_notification.html', exp_id=exp_id, form=form) + + +@app.route('/remove_research_notification') +@login_required +def remove_research_notification(): + + exp_id = request.args.get('exp_id', None) + + empty_filevariable = experiment.query.filter_by(idexperiment=exp_id).first() + + target = os.path.join(APP_ROOT, empty_filevariable.research_notification_filename) + + if os.path.exists(target): + os.remove(target) + + + empty_filevariable.research_notification_filename = None + + db.session.commit() + + return redirect(url_for('view_experiment', exp_id=exp_id)) + + + +@app.route('/view_research_notification') +@login_required +def view_research_notification(): + + exp_id = request.args.get('exp_id', None) + image = experiment.query.filter_by(idexperiment=exp_id).first() + + research_notification_filename = image.research_notification_filename + + return render_template('view_research_notification.html', research_notification_filename=research_notification_filename) + + + + @app.route('/download_csv') @@ -1497,3 +1959,18 @@ def researcher_info(): return render_template('researcher_info.html') + + + + +#TEST PAGE + +@app.route('/test_page') +def test_page(): + + flash('Please log in to access this page.') + + session.clear() + + return render_template('test_page.html') + diff --git a/app/static/css/custom.css b/app/static/css/custom.css index 2389230..407f953 100644 --- a/app/static/css/custom.css +++ b/app/static/css/custom.css @@ -1,7 +1,5 @@ -.btn { - border-radius: 0px; -} -.navbar-custom{ - background-color:red; - border-color: green; -} +body{ + +background-color: #000000; + +} \ No newline at end of file diff --git a/app/static/css/slider.css b/app/static/css/slider.css new file mode 100644 index 0000000..7cfc2e6 --- /dev/null +++ b/app/static/css/slider.css @@ -0,0 +1,6 @@ +input[type='range'] { + -webkit-appearance: none; + height: 50px; + + +} diff --git a/app/templates/add_stimuli.html b/app/templates/add_stimuli.html index f8617a1..334ce1f 100644 --- a/app/templates/add_stimuli.html +++ b/app/templates/add_stimuli.html @@ -10,18 +10,33 @@ <legend>Paste the new texts to the textarea and mark the end of each stimulus with a /n. Do not place the marker at the end of the last text. Example: Text1/n Text2/n Text3</legend> <textarea class="form-control" rows="10" id="text" name="text"></textarea> </div> - {% else %} + {% endif %} + {% if stimulus_type == 'video' or stimulus_type == 'audio' or stimulus_type == 'picture' %} <div class="input-group mb-3"> <legend>Add files:</legend> <div class="input-group-prepend"> <span class="input-group-text">Upload:</span> </div> <div class="custom-file"> - <input type="file" class="custom-file-input" id="file" name="file" accept="audio/*,video/*,image/*" multiple> + <input type="file" class="custom-file-input" id="file" name="file" accept="audio/*,image/*, .mp4" multiple> <label class="custom-file-label" for="upload_file">Choose file</label> </div> </div> - {% endif %} + {% endif %} + + + + + + + + + + + + + + <br> <button type="submit" class="btn btn-primary">Submit</button> <a class="btn btn-primary" href="{{ request.referrer }}" role="button">Cancel</a> diff --git a/app/templates/admin_dryrun.html b/app/templates/admin_dryrun.html new file mode 100644 index 0000000..2ee0d1e --- /dev/null +++ b/app/templates/admin_dryrun.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} +{% block content %} + + +<div class="container text-center"> +<div class="row mt-5 display-4"><br></div> + +<h1 class="mt-5 display-4"><br>Run experiment with any ID:</h1><br> +<br> + +<h3 class="display-5 text-center text-danger"> Notice!</h3> +<div class="lead text-center">You can use any login name for a testrun that is not currently in database for this experiment.</div> + +<br><br> + <form action="" method="post"> + {{ form.hidden_tag() }} + <p> + {{ form.participant_id(size=32) }}<br> + {% for error in form.participant_id.errors %} + <span style="color: red;">[{{ error }}]</span> + {% endfor %} + </p> + <p>{{ form.submit() }}</p> + + </form> +</div> + + +{% endblock %} \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index 3675532..a1fb514 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -2,7 +2,7 @@ {% import "bootstrap/wtf.html" as wtf %} <!doctype html> -<html lang="en"> +<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> @@ -12,22 +12,24 @@ <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script> - <title>Mega-fMRI Stimulus Rating Tool</title> + <title>Onni</title> <!-- Bootstrap core CSS --> <link href="../../dist/css/bootstrap.min.css" rel="stylesheet"> <!-- Custom styles for this template --> - <link href="sticky-footer-navbar.css" rel="stylesheet"> + + <link href="/static/css/slider.css" rel="stylesheet"> + </head> <body> <header> <!-- Navigation --> -<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top"> +<nav class="navbar navbar-expand navbar-dark bg-dark fixed-top"> <div class="col navbar-brand"> <img src="/static/img/madam-300x250.jpg" alt="Logo" style="width:70px;"> {% if pages %} - <a class="navbar-brand pl-5 font-weight-light">Participant ID: <span class="text-success font-weight-bold">{{ session['user']}}</span></a> + <a class="navbar-brand pl-5 font-weight-light"><span class="text-success font-weight-bold">{{ session['user']}}</span></a> {% else %} @@ -36,9 +38,9 @@ {% endif %} </div> - <div class="col-6 navbar-nav"> + <div class="navbar-nav w-50"> {% if pages %} - <div class="progress-bar bg-success progress-bar-striped" role="progressbar" style="width: {{ progress_bar_percentage }}%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">Task progress: {{ progress_bar_percentage }}%</div> + <div class="progress-bar bg-success progress-bar-striped" role="progressbar" style="width: {{ progress_bar_percentage }}%" aria-valuemin="0" aria-valuemax="100">{{ _('Task progress:') }} {{ progress_bar_percentage }}%</div> {% endif %} </div> <div class="col text-success text-right"> @@ -52,7 +54,6 @@ {% endwith %} {% endblock %} {% if current_user.is_authenticated %} - <a class="nav-item" href="{{ url_for('researcher_info') }}" class="nav-link">Info |</a> @@ -62,16 +63,17 @@ </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> - <a class="dropdown-item" href="{{ url_for('set_language', language='Finnish') }}">Finnish</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='English') }}">English</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='Persian') }}">Persian</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='Greek') }}">Greek</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='Italian') }}">Italian</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='Chinese') }}">Chinese</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='All') }}">Show all languages</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Finnish', lang='fi') }}">Finnish</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='English', lang='en') }}">English</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Persian', lang='fa') }}">Persian</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Greek', lang='el') }}">Greek</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Italian', lang='it') }}">Italian</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Chinese', lang='zh') }}">Chinese</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='All') }}">Show all experiments</a> </div> - - <a class="nav-item" href="{{ url_for('create_experiment') }}" class="nav-link">| Create experiment |</a> + <a class="nav-item" href="{{ url_for('researcher_info') }}" class="nav-link">| Info |</a> + <a class="nav-item" href="{{ url_for('create_experiment') }}" class="nav-link">Create |</a> + <a class="nav-item" href="" class="nav-link">Archives |</a> {% endif %} {% if current_user.is_anonymous %} @@ -83,13 +85,13 @@ </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> - <a class="dropdown-item" href="{{ url_for('set_language', language='Finnish') }}">Finnish</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='English') }}">English</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='Persian') }}">Persian</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='Greek') }}">Greek</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='Italian') }}">Italian</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='Chinese') }}">Chinese</a> - <a class="dropdown-item" href="{{ url_for('set_language', language='All') }}">Show all languages</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Finnish', lang='fi') }}">Finnish</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='English', lang='en') }}">English</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Persian', lang='fa') }}">Persian</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Greek', lang='el') }}">Greek</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Italian', lang='it') }}">Italian</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='Chinese', lang='zh') }}">Chinese</a> + <a class="dropdown-item" href="{{ url_for('set_language', language='All') }}">Show all experiments</a> </div> diff --git a/app/templates/begin_with_id.html b/app/templates/begin_with_id.html index 3e9bb98..541a2e1 100644 --- a/app/templates/begin_with_id.html +++ b/app/templates/begin_with_id.html @@ -5,11 +5,14 @@ <div class="container text-center"> <div class="row mt-5 display-4"><br></div> -<h1 class="mt-5 display-4"><br>Please insert your ID-code below:</h1><br> +<h1 class="mt-5 display-4"><br>{{ _('Please insert your ID-code below:') }}</h1><br> + <br> -<h3 class="display-5 text-center text-danger"> Notice!</h3> -<div class="row lead">This login is meant only for participants who have received an identification code from a researcher to be used in the rating task. If you have not received such please return to the previous page and select the "Begin task" function instead.</div> +<h3 class="display-5 text-center text-danger">{{ _('Notice!') }}</h3> +<div class="lead text-center">{{ _('Participation in this experiment requires a login with a predetermined ID code. Please input ID below.') }}</div> + + <br><br> <form action="" method="post"> diff --git a/app/templates/consent.html b/app/templates/consent.html index c6b5b6a..58eaec3 100644 --- a/app/templates/consent.html +++ b/app/templates/consent.html @@ -1,22 +1,24 @@ {% extends "base.html" %} {% block content %} + + -<h1 class="row mt-5 display-4"><br>This is the consent page for experiment ID: {{ exp_id }}</h1> +<h1 class="container mt-5 display-4"><br> {{ experiment_info.name }}</h1> +<br> +<p class="lead">{{ experiment_info.short_instruction }}</p> <br> -<h4>Lue tutkimustiedote <a href="tiedote.pdf">tästä.</a></h4> -<br/> -<p class="lead">Prior to giving the consent I have read and understood the Experiment/ Research Bulletin I received, and I have received sufficient information about the course of the experiment. I have been clarified that the experiment data collected from me will be treated confidentially in such way that my identity can not be identified. I understand that my participation in the study is completely voluntary and that I can stop the experiment at any stage of the experiment without giving any reason. Furthermore, I have been clarified that I will receive further information about the general principles and the progress of the experiment from the researcher mentioned at the Experiment/ Research Bulletin, if I wish to do so. I understand that the data is collected only for purposes of the scientific research and it is not even partially disclosed to the participant himself/ herself and that my IP address or other identifying information will not be saved. -</p> -<p class="lead">By clicking on the button below, I give my consent to the collection and processing of the data in this experiment, as described in the Experiment/ Research Bulletin. +<h3>{{ _('Consent for participation:') }}</h3> -</p> -<p class="lead">Of this electronical consent, there will be a digital entry saved in the files of the researcher responsible for the experiment. +{% if experiment_info.research_notification_filename %} +<h5> {{ _('Research bulletin can be read') }} <a href="{{ url_for('view_research_notification', exp_id=experiment_info.idexperiment) }}">{{ _('here.') }}</a></h5> +{% endif %} -</p> -<p> - <a class="btn btn-primary" href="{{ url_for('participant_session', exp_id=exp_id, agree='true') }}" role="button">Agree</a> - <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">Disagree</button> +<p class="lead"> {{ experiment_info.consent_text }} </p> + + + <a class="btn btn-primary" href="{{ url_for('participant_session', exp_id=exp_id, agree='true') }}" role="button">{{ _('Agree') }}</a> + <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">{{ _('Disagree') }}</button> <!-- Modal --> <div class="modal fade" id="myModal" role="dialog"> <div class="modal-dialog modal-dialog-centered"> @@ -24,19 +26,20 @@ <div class="modal-content modal-dialog-centered"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> - <h4 class="modal-title">Notice!</h4> + <h4 class="modal-title">{{ _('Notice!') }}</h4> </div> <div class="modal-body"> - <p>In order to participate for the study you need to agree with the terms presented.</p> + <p>{{ _('In order to participate for the study you need to agree with the terms presented.') }}</p> </div> <div class="modal-footer"> - <button type="button" class="btn btn-default" data-dismiss="modal">Close Notice</button> - <a class="btn btn-primary" href="/" role="button">Return Home</a> + <button type="button" class="btn btn-default" data-dismiss="modal">{{ _('Close Notice') }}</button> + <a class="btn btn-primary" href="/" role="button">{{ _('Return Home') }}</a> </div> </div> </div> </div> + {% endblock %} diff --git a/app/templates/continue_task.html b/app/templates/continue_task.html index ad2084d..7fb5d78 100644 --- a/app/templates/continue_task.html +++ b/app/templates/continue_task.html @@ -6,7 +6,9 @@ <div class="row mt-5 display-4"><br></div> <br> -<h1 class="mt-5 display-4"><br>Please insert your participant ID:</h1><br> +<h1 class="mt-5 display-4"><br>{{ _('Please insert your participant ID:') }}</h1><br> + + <form action="" method="post"> {{ form.hidden_tag() }} <p> diff --git a/app/templates/create_experiment.html b/app/templates/create_experiment.html index 97c3275..2243a53 100644 --- a/app/templates/create_experiment.html +++ b/app/templates/create_experiment.html @@ -11,15 +11,15 @@ <div class="col-12"> <form action="" method="post" role="form"> <div class="form-group"> - <label for="name">Experiment name:</label> - <input required type="text" class="form-control" id="name" name="name" placeholder="Name?"> + <label for="name">Your name:</label> + <input required type="text" class="form-control" id="creator_name" name="creator_name" placeholder="Creator name?"> + <br> + <label for="name">Name of the experiment:</label> + <input required type="text" class="form-control" id="name" name="name" placeholder="Experiment name?"> <br> - <label for="instruction">Instructions:</label> - <input required type="text" class="form-control" id="instruction" name="instruction" placeholder="Instructions?"> - <br> <div class="form-group"> - <label for="language">Language:</label> + <label for="language">Select a language for the experiment:</label> <select class="form-control" id="language" name="language"> <option disabled selected value></option> <option value="Afrikanns">Afrikanns</option> @@ -95,8 +95,35 @@ <option value="Welsh">Welsh</option> <option value="Xhosa">Xhosa</option> </select> - </div> - </div> + +<br> + <p>Instructions for the experiment come in three forms: + <br> (1) A single sentence instruction that is shown during the rating task above the sliders. + <br> (2) A short general description of the task that is shown on the experiment listing on Onni's front page and on the informed consent page. + <br> (3) a longer detailed explanation of the instructions that is shown to the participant after the consent and before the rating task begins. + <br> Please input all three types of instructions below: + </p> + + <label for="single_sentence_instruction">(1) Single sentence:</label> + <input required type="text" class="form-control" id="single_sentence_instruction" name="single_sentence_instruction" placeholder="Input here" required> + <br> + <label for="short_instruction">(2) Short description:</label> + <textarea class="form-control" rows="5" id="short_instruction" name="short_instruction" placeholder="Input here" required></textarea> + <br> + + + <label for="instruction">(3) Longer version:</label> + <textarea class="form-control" rows="15" id="instruction" name="instruction" placeholder="Input here" required></textarea> + <br> + + + <label for="instruction">Please input consent form text</label> + <textarea class="form-control" rows="15" id="consent_text" name="consent_text" placeholder="Input here" required></textarea> + <br> + + + </div> + </div> <br> <button type="submit" class="btn btn-primary">Submit</button> </form> diff --git a/app/templates/create_experiment_questions.html b/app/templates/create_experiment_questions.html index a3401e8..8e990cf 100644 --- a/app/templates/create_experiment_questions.html +++ b/app/templates/create_experiment_questions.html @@ -5,7 +5,7 @@ <h1 class="container mt-5 display-4 text-center"><br>Create new experiment: (3/4)</h1> <br> <p class="lead">Please paste the slider set questions followed by the left and right ends of the scales separated with a ; Place a /n after the right scale to input another question - followed by the corresponding scales. Make sure you do not input the /n after the last question. + followed by the corresponding scales. Make sure you do not input the /n after the last question! <br> <br> @@ -25,7 +25,7 @@ <form action="" method="post" role="form"> <div class="form-group"> - <label for="questions_and_options">Question;left scale;right scale/n</label> + <label for="questions_and_options">(NOTE! Do not input /n after the last right scale)</label> <textarea class="form-control" rows="15" id="questions_and_options" name="questions_and_options"></textarea> </div> <button type="submit" class="btn btn-primary">Submit</button> diff --git a/app/templates/create_experiment_upload_stimuli.html b/app/templates/create_experiment_upload_stimuli.html index c718d5f..979ed4a 100644 --- a/app/templates/create_experiment_upload_stimuli.html +++ b/app/templates/create_experiment_upload_stimuli.html @@ -44,10 +44,6 @@ </div> </fieldset> - - - - <div class="form-group"> <legend>2. Use this box to upload text stimuli:</legend> <label for="text_stimulus font-weight-bold">Example: text1 /n text2 /n text3</label> @@ -62,7 +58,7 @@ <span class="input-group-text">Upload:</span> </div> <div class="custom-file"> - <input type="file" class="custom-file-input" id="file" name="file" accept="audio/*,video/*,image/*" multiple> + <input type="file" class="custom-file-input" id="file" name="file" accept="audio/*,image/*, .mp4" multiple> <label class="custom-file-label" for="upload_file">Choose file</label> </div> </div> diff --git a/app/templates/edit_experiment.html b/app/templates/edit_experiment.html index 8815f36..daac537 100644 --- a/app/templates/edit_experiment.html +++ b/app/templates/edit_experiment.html @@ -20,10 +20,27 @@ <label for="Name">Name:</label> <input type="text" class="form-control" id="name" name="name" placeholder={{ form.name }} <br> - <label for="Instruction">Instructions:</label> - <input required type="text" class="form-control" id="instruction" name="instruction" placeholder= {{ form.instruction }} + <label for="Name">Creator:</label> + <input type="text" class="form-control" id="creator_name" name="creator_name" placeholder={{ form.creator_name }} + <br> + <label for="Instruction">Single sentence instruction:</label> + <input required type="text" class="form-control" id="instruction" name="single_sentence_instruction" placeholder= {{ form.single_sentence_instruction }} + <br> + <label for="Instruction">Short description:</label> + <textarea required class="form-control" rows="5" id="short_instruction" name="short_instruction" placeholder= {{ form.short_instruction }} </textarea> + <br> + + <label for="Instruction">Long instructions:</label> + <textarea required class="form-control" rows="10" id="instruction" name="instruction" placeholder={{ form.instruction }} </textarea> <br> + + <label for="Consent_form_text">Consent form text:</label> + <textarea required class="form-control" rows="10" id="consent_text" name="consent_text" placeholder={{ form.consent_text }} </textarea> + <br> + + {{ render_field(form.language) }} + {{ render_field(form.stimulus_size) }} <p>Note. When sizing text stimuli the size changes only in increments of 2 of this variable. </div> <br> <button type="submit" class="btn btn-primary">Update</button> diff --git a/app/templates/experiment_statistics.html b/app/templates/experiment_statistics.html index 45fe3c5..d5c7b64 100644 --- a/app/templates/experiment_statistics.html +++ b/app/templates/experiment_statistics.html @@ -35,7 +35,7 @@ </tr> <tr> <td>Number of finished ratings:</td> - <td>??</td> + <td>{{ finished_ratings }}</td> </tr> <tr> <td><a class="btn btn-primary btn-info" href="{{ url_for('download_csv', exp_id=exp.idexperiment) }}" role="button">Export results (csv)</a></td> @@ -46,18 +46,90 @@ {% endfor %} -<h1 class="container mt-5 display-4 text-left"><br>Rating task values:</h1> + + +<h1 class="container mt-5 display-4 text-left"><br>Rating task question headers:</h1> +<br> +<table class="table"> + <thead> + <tr> + <th scope="col" nowrap>Question ID:</td> + <th scope="col" nowrap>Question:</th> + <th scope="col" nowrap>Left scale</th> + <th scope="col" nowrap>Right scale</th> + </tr> + </thead> + <tbody> + {% for q in question_headers %} + <tr> + <td>{{ q.idquestion }}</td> + <td>{{ q.question }}</td> + <td>{{ q.left }}</td> + <td>{{ q.right }}</td> + </tr> + {% endfor %} + </tbody> +</table> + +<h1 class="container mt-5 display-4 text-left"><br>Rating task stimulus headers:</h1> +<br> +<table class="table"> + <thead> + <tr> + <th scope="col" nowrap>Stimulus ID:</td> + <th scope="col" nowrap>Stimulus:</th> + </tr> + </thead> + <tbody> + {% for s in stimulus_headers %} + <tr> + <td>{{ s.idpage }}</td> + {% if s.type == 'text' %} + <td>{{ s.text }}</td> + {% else %} + <td>{{ s.media }}</td> + {% endif %} + + </tr> + {% endfor %} + </tbody> +</table> + + + + + + + + + + + + + + + + + + + + + + + +<h1 class="container mt-5 display-4 text-left"><br>Rating task values: (Stimulus ID/Question ID)</h1> <br> <table class="table"> <thead> + <tr> - <th scope="col" nowrap>Page ID/Question:</td> + <th scope="col" nowrap>Participant ID:</th> {% for page in pages_and_questions %} {% for p in pages_and_questions[page] %} - <th scope="col" nowrap>{{ p[0]}} / {{ p[1]}} </th> + <th scope="col" nowrap>{{ p[0]}}/{{ p[1]}}</th> {% endfor %} {% endfor %} @@ -68,7 +140,7 @@ <tr> <td>{{ participant }}</td> {% for answer in participants_and_answers[participant] %} - <td align="center">{{ answer[3] }}</td> + <td>{{ answer[3] }}</td> {% endfor %} </tr> {% endfor %} diff --git a/app/templates/index.html b/app/templates/index.html index 5aa7c8c..aa611a6 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -2,50 +2,53 @@ {% block content %} + <h1 class="container mt-5 display-4 text-center"><br>{{ _('Welcome to Onni') }}</h1> <br> <br> - <p class="lead text-center">This is the Human Emotion Systems laboratorys stimulus rating tool. If you have previously started a rating task you can continue that task on this page. If you are a researcher you can create new rating tasks by <a href="{{ url_for('login') }}">logging in.</a> - Or you can start a new rating task and start rating by selecting a task from the database list below. + <p class="lead text-center">{{ _('This is the Human Emotion Systems laboratorys stimulus rating tool. If you have previously started a rating task you can continue that task on this page. If you are a researcher you can create new rating tasks by logging in. Or you can start a new rating task and start rating by selecting a task from the database list below.') }}</p> <br> <br> - You can choose the language suitable for you from the language menu in the upper right corner + + <p class="lead text-center">{{ _('You can choose the language suitable for you from the language menu in the upper right corner') }}</p> + </p> <div class="row"> <div class="col mt-5"> - <h3>List of experiments in database:</h3> + <h3>{{ _('List of experiments in database:') }}</h3> {% block attributes %} {% for exp in experiments %} {% if exp.status == 'Public' and session['language'] == exp.language %} <ul class="list-group mb-4"> - <li class="list-group-item active"><span class="font-weight-bold">Name:</span> {{ exp.name }} </li> - <li class="list-group-item"><span class="font-weight-bold">Instruction:</span> {{ exp.instruction }}</li> + <li class="list-group-item active"><span class="font-weight-bold">{{ _('Name:') }}</span> {{ exp.name }} </li> + <li class="list-group-item"><span class="font-weight-bold">{{ _('Instruction:') }}</span> {{ exp.short_instruction }}</li> {% if current_user.is_authenticated %} <li class="list-group-item"><span class="font-weight-bold">ID number:</span> {{ exp.idexperiment }} </li> <li class="list-group-item"><span class="font-weight-bold">Language:</span> {{ exp.language }}</li> <li class="list-group-item"><span class="font-weight-bold">Status:</span> {{ exp.status }}</li> {% endif %} + + {% if exp.use_forced_id == 'On'%} + <li class="list-group-item"><span class="font-weight-bold">{{ _('Participation ID is required for this task.') }}</li> + {% endif %} + <li class="list-group-item"> - <button class="btn btn-outline-success dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - Begin task - </button> - <div class="dropdown-menu" aria-labelledby="dropdownMenuButton"> - <a class="dropdown-item" href="{{ url_for('consent', exp_id=exp.idexperiment) }}">As a new participant</a> - <a class="dropdown-item" href="{{ url_for('begin_with_id', exp_id=exp.idexperiment) }}">I have received an ID to use for this task</a> - </div> - <a class="btn btn-outline-success" href="{{ url_for('continue_task', exp_id=exp.idexperiment) }}" role="button">Continue task</a> + + + <a class="btn btn-outline-success" href="{{ url_for('consent', exp_id=exp.idexperiment) }}" role="button">{{ _('Begin task') }}</a> + <a class="btn btn-outline-success" href="{{ url_for('continue_task', exp_id=exp.idexperiment) }}" role="button">{{ _('Continue task') }}</a> {% if current_user.is_authenticated %} - - - <a class="btn btn-outline-info" href="{{ url_for('experiment_statistics', exp_id=exp.idexperiment) }}" role="button">Statistics</a> - <a class="btn btn-outline-info" href="{{ url_for('view_experiment', exp_id=exp.idexperiment) }}" role="button">View / Edit</a> + <span class="text-right"> + <a class="btn btn-outline-info" href="{{ url_for('admin_dryrun', exp_id=exp.idexperiment) }}" role="button">{{ _('AdminRun') }}</a> + <a class="btn btn-outline-info" href="{{ url_for('experiment_statistics', exp_id=exp.idexperiment) }}" role="button">{{ _('Statistics') }}</a> + <a class="btn btn-outline-info" href="{{ url_for('view_experiment', exp_id=exp.idexperiment) }}" role="button">{{ _('View / Edit') }}</a> {% endif %} - + </li> </ul> <br> <br> @@ -55,32 +58,32 @@ {% if exp.status == 'Public' and session['language'] == "All" %} <ul class="list-group mb-4"> - <li class="list-group-item active"><span class="font-weight-bold">Name:</span> {{ exp.name }} </li> - <li class="list-group-item"><span class="font-weight-bold">Instruction:</span> {{ exp.instruction }}</li> + <li class="list-group-item active"><span class="font-weight-bold">{{ _('Name:') }}</span> {{ exp.name }} </li> + <li class="list-group-item"><span class="font-weight-bold">{{ _('Instruction:') }}</span> {{ exp.short_instruction }}</li> {% if current_user.is_authenticated %} <li class="list-group-item"><span class="font-weight-bold">ID number:</span> {{ exp.idexperiment }} </li> <li class="list-group-item"><span class="font-weight-bold">Language:</span> {{ exp.language }}</li> <li class="list-group-item"><span class="font-weight-bold">Status:</span> {{ exp.status }}</li> {% endif %} + {% if exp.use_forced_id == 'On'%} + <li class="list-group-item"><span class="font-weight-bold">{{ _('Participation ID is required for this task.') }}</li> + {% endif %} + + <li class="list-group-item"> - <button class="btn btn-outline-success dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - Begin task - </button> - <div class="dropdown-menu" aria-labelledby="dropdownMenuButton"> - <a class="dropdown-item" href="{{ url_for('consent', exp_id=exp.idexperiment) }}">As a new participant</a> - <a class="dropdown-item" href="{{ url_for('begin_with_id', exp_id=exp.idexperiment) }}">I have received an ID to use for this task</a> - </div> - <a class="btn btn-outline-success" href="{{ url_for('continue_task', exp_id=exp.idexperiment) }}" role="button">Continue task</a> + + <a class="btn btn-outline-success" href="{{ url_for('consent', exp_id=exp.idexperiment) }}" role="button">{{ _('Begin task') }}</a> + <a class="btn btn-outline-success" href="{{ url_for('continue_task', exp_id=exp.idexperiment) }}" role="button">{{ _('Continue task') }}</a {% if current_user.is_authenticated %} - - - <a class="btn btn-outline-info" href="{{ url_for('experiment_statistics', exp_id=exp.idexperiment) }}" role="button">Statistics</a> - <a class="btn btn-outline-info" href="{{ url_for('view_experiment', exp_id=exp.idexperiment) }}" role="button">View / Edit</a> + <span class="text-right"> + <a class="btn btn-outline-info" href="{{ url_for('admin_dryrun', exp_id=exp.idexperiment) }}" role="button">{{ _('AdminRun') }}</a> + <a class="btn btn-outline-info" href="{{ url_for('experiment_statistics', exp_id=exp.idexperiment) }}" role="button">{{ _('Statistics') }}</a> + <a class="btn btn-outline-info" href="{{ url_for('view_experiment', exp_id=exp.idexperiment) }}" role="button">{{ _('View / Edit') }}</a> {% endif %} - + </li> </ul> <br> <br> @@ -92,24 +95,23 @@ <h3>Unpublished experiment:</h3> <ul class="list-group mb-4"> <li class="list-group-item list-group-item-dark"><span class="font-weight-bold">Name:</span> {{ exp.name }} </li> - <li class="list-group-item"><span class="font-weight-bold">Instruction:</span> {{ exp.instruction }}</li> + <li class="list-group-item"><span class="font-weight-bold">Instruction:</span> {{ exp.short_instruction }}</li> {% if current_user.is_authenticated %} <li class="list-group-item"><span class="font-weight-bold">ID number:</span> {{ exp.idexperiment }} </li> <li class="list-group-item"><span class="font-weight-bold">Language:</span> {{ exp.language }}</li> <li class="list-group-item"><span class="font-weight-bold">Status:</span> {{ exp.status }}</li> {% endif %} + {% if exp.use_forced_id == 'On'%} + <li class="list-group-item"><span class="font-weight-bold">Participation ID is required for this task.</li> + {% endif %} + + <li class="list-group-item"> - <button class="btn btn-outline-success dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - Begin task - </button> - <div class="dropdown-menu" aria-labelledby="dropdownMenuButton"> - <a class="dropdown-item" href="{{ url_for('consent', exp_id=exp.idexperiment) }}">As a new participant</a> - <a class="dropdown-item" href="{{ url_for('begin_with_id', exp_id=exp.idexperiment) }}">I have received an ID to use for this task</a> - </div> + <a class="btn btn-outline-success" href="{{ url_for('consent', exp_id=exp.idexperiment) }}" role="button">Begin task</a> <a class="btn btn-outline-success" href="{{ url_for('continue_task', exp_id=exp.idexperiment) }}" role="button">Continue task</a> {% if current_user.is_authenticated %} - + <a class="btn btn-outline-info" href="{{ url_for('admin_dryrun', exp_id=exp.idexperiment) }}" role="button">AdminRun</a> <a class="btn btn-outline-info" href="{{ url_for('experiment_statistics', exp_id=exp.idexperiment) }}" role="button">Statistics</a> <a class="btn btn-outline-info" href="{{ url_for('view_experiment', exp_id=exp.idexperiment) }}" role="button">View / Edit</a> @@ -126,24 +128,23 @@ <h3>Unpublished experiment:</h3> <ul class="list-group mb-4"> <li class="list-group-item list-group-item-dark"><span class="font-weight-bold">Name:</span> {{ exp.name }} </li> - <li class="list-group-item"><span class="font-weight-bold">Instruction:</span> {{ exp.instruction }}</li> + <li class="list-group-item"><span class="font-weight-bold">Instruction:</span> {{ exp.short_instruction }}</li> {% if current_user.is_authenticated %} <li class="list-group-item"><span class="font-weight-bold">ID number:</span> {{ exp.idexperiment }} </li> <li class="list-group-item"><span class="font-weight-bold">Language:</span> {{ exp.language }}</li> <li class="list-group-item"><span class="font-weight-bold">Status:</span> {{ exp.status }}</li> {% endif %} + {% if exp.use_forced_id == 'On'%} + <li class="list-group-item"><span class="font-weight-bold">Participation ID is required for this task.</li> + {% endif %} + + <li class="list-group-item"> - <button class="btn btn-outline-success dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - Begin task - </button> - <div class="dropdown-menu" aria-labelledby="dropdownMenuButton"> - <a class="dropdown-item" href="{{ url_for('consent', exp_id=exp.idexperiment) }}">As a new participant</a> - <a class="dropdown-item" href="{{ url_for('begin_with_id', exp_id=exp.idexperiment) }}">I have received an ID to use for this task</a> - </div> + <a class="btn btn-outline-success" href="{{ url_for('consent', exp_id=exp.idexperiment) }}" role="button">Begin task</a> <a class="btn btn-outline-success" href="{{ url_for('continue_task', exp_id=exp.idexperiment) }}" role="button">Continue task</a> {% if current_user.is_authenticated %} - + <a class="btn btn-outline-info" href="{{ url_for('admin_dryrun', exp_id=exp.idexperiment) }}" role="button">AdminRun</a> <a class="btn btn-outline-info" href="{{ url_for('experiment_statistics', exp_id=exp.idexperiment) }}" role="button">Statistics</a> <a class="btn btn-outline-info" href="{{ url_for('view_experiment', exp_id=exp.idexperiment) }}" role="button">View / Edit</a> diff --git a/app/templates/instructions.html b/app/templates/instructions.html index 6c2c320..0049144 100644 --- a/app/templates/instructions.html +++ b/app/templates/instructions.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %} -<h1 class="row mt-5 display-4"><br>Rating task instructions:</h1> +<h1 class="container mt-5 display-4"><br>{{ _('Instructions:') }}</h1> {% block attributes %} @@ -11,14 +11,14 @@ {% endblock %} <br> -<h3 class="row display-5 text-danger"> Notice!</h3> -<div class="row lead">If you wish to quit a rating task before it is fully completed, you can return to finish the task later but you will need your participant ID-number in order to do that. Please save your participant ID before starting the rating task!</div> +<h3 class="row display-5 text-danger">{{ _('Notice!') }}</h3> +<div class="row lead">{{ _('If you wish to quit a rating task before it is fully completed, you can return to finish the task later but you will need your participant ID-number in order to do that. Please save your participant ID before starting the rating task!') }}</div> <br> -<h4 class="row">Your participant ID is: <div class="text-danger"> {{ session['user'] }} </div></h4> +<h4 class="row">{{ _('Your participant ID is:') }} <div class="text-danger"> {{ session['user'] }} </div></h4> <br> -<a class="btn btn-primary" href="/task/1" role="button">I'm ready to start</a> +<a class="btn btn-primary" href="/task/1" role="button">{{ _('Ready to start') }}</a> {% endblock %} diff --git a/app/templates/quit_task.html b/app/templates/quit_task.html index 78efec3..9a82201 100644 --- a/app/templates/quit_task.html +++ b/app/templates/quit_task.html @@ -1,16 +1,16 @@ {% extends "base.html" %} {% block content %} -<h1 class="row mt-5 display-4"><br>Notice!</h1> +<h1 class="container mt-5 display-4"><br>{{ _('Notice!') }}</h1> <br> -<h3 class="row display-5 text-danger"> Notice!</h3> -<div class="row lead">Please write down your participant ID so you can return and finish the rating task later!</div> +<h3 class="row display-5 text-danger">{{ _('Notice!') }}</h3> +<div class="row lead">{{ _('Please write down your participant ID so you can return and finish the rating task later!') }}</div> <br> -<h4 class="row">Your participant ID is: <div class="text-danger"> {{ user_id }} </div></h4> +<h4 class="row">{{ _('Your participant ID is:') }} <div class="text-danger"> {{ user_id }} </div></h4> <br> -<a class="btn btn-primary" href="/" role="button">Quit!</a> +<a class="btn btn-primary" href="/" role="button">{{ _('Quit!') }}</a> {% endblock %} \ No newline at end of file diff --git a/app/templates/register.html b/app/templates/register.html index 9526075..aaf34c1 100644 --- a/app/templates/register.html +++ b/app/templates/register.html @@ -3,15 +3,15 @@ {% block content %} <div class="container text-center mt-5"> - <h1 class="display-4"><br>This is the registration page.</h1> - <p class="lead"> Please fill in these background questions before starting the rating task:</p> + <h1 class="display-4"><br>{{ _('This is the registration page.') }}</h1> + <p class="lead">{{ _('Please fill in these background questions before starting the rating task:') }}</p> </div> <form class="form-group" action="" method="post"> {% for options in form.questions1 %} <div class="form-group"> <label for="{{ options[0] }}">{{ options[1] }}</label> <select required class="form-control" name="{{ options[0] }}"> - <option disabled selected value></option> + <option disabled selected value>{{ _('Please select') }}</option> {% for op in form.questions1[options] %} <option value="{{ op[0] }}" name="{{ op[0] }}">{{ op[0] }}</option> {% endfor %} @@ -19,7 +19,7 @@ </div> {% endfor %} <p> - <button type="submit" class="btn btn-primary">Submit</button> + <button type="submit" class="btn btn-primary">{{ _('Submit') }}</button> </p> </form> diff --git a/app/templates/researcher_info.html b/app/templates/researcher_info.html index 0a79d0d..62f79b9 100644 --- a/app/templates/researcher_info.html +++ b/app/templates/researcher_info.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %} -<h1 class="row mt-5 display-4"><br>How to prepare your stimuli before uploading:</h1> +<h1 class="container mt-5 display-4"><br>How to prepare your stimuli before uploading:</h1> <br> <h4 class="">How to split audiofiles into sections:</h4> diff --git a/app/templates/task.html b/app/templates/task.html index d0d8ade..558975d 100644 --- a/app/templates/task.html +++ b/app/templates/task.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %} -<br> + <br> {% if session['randomization']=='Off' %} @@ -10,15 +10,15 @@ {% if session['type']=='text' %} <div class="container text-center mt-5 pt-5"> {% for page in pages.items %} - <h3 class="text-center mt-5"><br>{{ page.text }}</h3> + <h{{ stimulus_size_text }} class="text-center mt-5"><br>{{ page.text }}</h{{ stimulus_size_text }}> {% endfor %} </div> - <br><br><br><br><br> + <br><br> {% endif %} {% if session['type']=='picture' %} - <div class="container stimulus col-9 mt-5 pt-5"> + <div class="container stimulus col-{{stimulus_size}} mt-5 pt-5"> {% for page in pages.items %} <img src="/{{ page.media }}" class="img-fluid"> {% endfor %} @@ -27,7 +27,7 @@ {% if session['type']=='video' %} - <div class="col-9 container stimulus mt-5 pt-5"> + <div class="col-{{stimulus_size}} container stimulus mt-5 pt-5"> {% for page in pages.items %} <div class="embed-responsive embed-responsive-16by9"> <iframe class="embed-responsive-item" src="/{{ page.media }}" allowfullscreen></iframe> @@ -38,7 +38,7 @@ {% if session['type']=='audio' %} - <div class="col-4 container stimulus mt-5 pt-5"> + <div class="col-{{stimulus_size}} container stimulus mt-5 pt-5"> {% for page in pages.items %} <div class="embed-responsive embed-responsive-16by9"> <iframe class="embed-responsive-item" src="/{{ page.media }}" allowfullscreen></iframe> @@ -55,15 +55,15 @@ {% if session['type']=='text' %} <div class="container text-center mt-5 pt-5"> {% for page in pages.items %} - <h3 class="text-center mt-5"><br>{{ randomized_stimulus.text }}</h3> + <h{{ stimulus_size_text }} class="text-center mt-5"><br>{{ randomized_stimulus.text }}</h{{ stimulus_size_text }}> {% endfor %} </div> - <br><br><br><br><br> + <br><br> {% endif %} {% if session['type']=='picture' %} - <div class="container stimulus col-9 mt-5 pt-5"> + <div class="container stimulus col-{{stimulus_size}} mt-5 pt-5"> {% for page in pages.items %} <img src="/{{ randomized_stimulus.media }}" class="img-fluid"> {% endfor %} @@ -72,7 +72,7 @@ {% if session['type']=='video' %} - <div class="col-9 container stimulus mt-5 pt-5"> + <div class="col-{{stimulus_size}} container stimulus mt-5 pt-5"> {% for page in pages.items %} <div class="embed-responsive embed-responsive-16by9"> <iframe class="embed-responsive-item" src="/{{ randomized_stimulus.media }}" allowfullscreen></iframe> @@ -83,7 +83,7 @@ {% if session['type']=='audio' %} - <div class="col-4 container stimulus mt-5 pt-5"> + <div class="col-{{stimulus_size}} container stimulus mt-5 pt-5"> {% for page in pages.items %} <div class="embed-responsive embed-responsive-16by9"> <iframe class="embed-responsive-item" src="/{{ randomized_stimulus.media }}" allowfullscreen></iframe> @@ -96,39 +96,40 @@ {% endif %} - - - - - - <br> - <h4 class="text-center">Rate the above stimulus based on these categories</h4> + + + + <h4 class="text-center">{{ rating_instruction }}</h4> <form class="form-group mt-5" action="" method="post"> {% for category in form.categories1 %} {% for scale in form.categories1[category] %} - <div class="row form-group"> - <div class="col-2 text-center"> - <p>{{ scale[0] }}</p> - </div> - <div class="col text-center"> + <div class="row form-group mt-0 mb-0"> + <h6 class="col-3 text-right mt-0 mb-0"> + {{ scale[0] }} + </h6> + <h6 class="col text-center mt-0 mb-0"> <label for="customRange">{{ category[1] }}</label> <input type="range" class="custom-range" id="customRange" name={{ category[0] }}> - </div> - <div class="col-2 text-center"> - <p>{{ scale[1] }}</p> - </div> + </h6> + <h6 class="col-3 text-left mt-0 mb-0"> + {{ scale[1] }} + </h6> </div> {% endfor %} {% endfor %} <div class="form-row text-center"> <div class="col-12"> - <a class="btn btn-primary" href={{ url_for('quit_task') }} role="button">Quit task</a> - <button type="submit" class="btn btn-primary">Next page</button> + <a class="btn btn-primary" href={{ url_for('quit_task') }} role="button">{{ _('Quit task') }}</a> + <button type="submit" class="btn btn-primary">{{ _('Next page') }}</button> + </div> + <div class="col-12"> + <br> + <p>{{ _('You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or ⌘+/⌘- (Mac)') }} </p> </div> </div> </form> diff --git a/app/templates/task_completed.html b/app/templates/task_completed.html index a12ea8d..631f82b 100644 --- a/app/templates/task_completed.html +++ b/app/templates/task_completed.html @@ -4,15 +4,15 @@ <h1 class="row mt-5 display-4"> <div class="container text-center"> - <br>Task completed!</h1> + <br>{{ _('Task completed!') }}</h1> <br> </div> <div class="container text-center lead"> - <p>You have completed the rating task. Thank you for your participation :)</p> + <p>{{ _('You have completed the rating task. Thank you for your participation.') }}</p> </div> <p> <div class="container text-center"> - <a class="btn btn-primary" href="/" role="button">Return Home</a> + <a class="btn btn-primary" href="/" role="button">{{ _('Return Home') }}</a> </div> diff --git a/app/templates/test_page.html b/app/templates/test_page.html new file mode 100644 index 0000000..f204c39 --- /dev/null +++ b/app/templates/test_page.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% block content %} + +<h1 class="container mt-5">moro</h1> + + +<h1 class="container mt-5">{{ _('File Not Found') }}</h1> + +{% endblock %} + + + diff --git a/app/templates/upload_research_notification.html b/app/templates/upload_research_notification.html new file mode 100644 index 0000000..57ebed8 --- /dev/null +++ b/app/templates/upload_research_notification.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} +{% block content %} +<h1 class="container mt-5 display-4 text-center"><br>Upload research bulletin:</h1> +<br> +<p class="lead"></p> + {% from "_formhelpers.html" import render_field %} + <form id="UploadResearchBulletinForm" action="" method="POST" role="form" enctype="multipart/form-data"> + <div class="input-group mb-3"> + <legend>Add bulletin imagefile:</legend> + <div class="input-group-prepend"> + <span class="input-group-text">Upload:</span> + </div> + <div class="custom-file"> + <input type="file" class="custom-file-input" id="file" name="file" accept="image/*" required> + <label class="custom-file-label" for="upload_file">Choose file</label> + </div> + </div> + + + + + + + + + + + + + + + <br> + <button type="submit" class="btn btn-primary">Submit</button> + <a class="btn btn-primary" href="{{ request.referrer }}" role="button">Cancel</a> +</form> +{% endblock %} + + diff --git a/app/templates/view_experiment.html b/app/templates/view_experiment.html index 512a1d8..095aae3 100644 --- a/app/templates/view_experiment.html +++ b/app/templates/view_experiment.html @@ -11,8 +11,10 @@ {% for exp in experiment_info %} + + <tr> - <td>Name:</td> + <td nowrap>Name:</td> <td>{{ exp.name }}</td> <td> <button type="button" class="btn btn-primary btn-block btn-sm btn-dark" data-toggle="modal" data-target="#myModal-remove">Remove experiment</button> @@ -39,7 +41,7 @@ </td> </tr> <tr> - <td>Status:</td> + <td nowrap>Status:</td> <td>{{ exp.status }}</td> <td> {% if exp.status == 'Hidden' %} @@ -49,17 +51,33 @@ <a class="btn btn-primary btn-block btn-sm btn-info" href="{{ url_for('hide_experiment', exp_id=exp.idexperiment) }}" role="button">Hide experiment</a></td> {% endif %} </tr> + <tr> - <td class"col-1">Instructions:</td> - <td class"col-10">{{ exp.instruction }}</td> - <td class"col-1"> - <a class="btn btn-primary btn-block btn-sm btn-info" href="{{ url_for('edit_experiment', exp_id=exp.idexperiment) }}" role="button">Edit info</a> - </td> + <td nowrap>Creator:</td> + <td>{{ exp.creator_name }} - {{ exp.creation_time }}</td> + <td nowrap></td> </tr> <tr> - <td>Trial randomization:</td> + <td nowrap>Language:</td> + <td>{{ exp.language }}</td> + <td nowrap></td> + </tr> + <tr> + <td nowrap>Stimulus type:</td> + <td>{{ mtype.type }}</td> + <td nowrap></td> + </tr> + <tr> + <td nowrap>Stimulus size:</td> + <td>{{ exp.stimulus_size }}</td> + <td nowrap> + </td> + </tr> + + <tr> + <td nowrap>Trial randomization:</td> <td>{{ exp.randomization }}</td> - <td> + <td nowrap> {% if exp.randomization == 'Off' %} <a class="btn btn-primary btn-block btn-sm btn-info" href="{{ url_for('enable_randomization', exp_id=exp.idexperiment) }}" role="button">Enable</a></td> {% endif %} @@ -67,24 +85,65 @@ <a class="btn btn-primary btn-block btn-sm btn-info" href="{{ url_for('disable_randomization', exp_id=exp.idexperiment) }}" role="button">Disable</a></td> {% endif %} - </td> + </td> + </tr> + <td nowrap>Use forced ID for participants:</td> + <td>{{ exp.use_forced_id }}</td> + <td nowrap> + {% if exp.use_forced_id == 'Off' %} + <a class="btn btn-primary btn-block btn-sm btn-info" href="{{ url_for('enable_forced_id', exp_id=exp.idexperiment) }}" role="button">Enable</a> + + + {% endif %} + {% if exp.use_forced_id == 'On' %} + <a class="btn btn-primary w-50 btn-sm btn-info" href="{{ url_for('disable_forced_id', exp_id=exp.idexperiment) }}" role="button">Disable</a> + <a class="btn btn-primary w-50 btn-sm btn-info" href="{{ url_for('view_forced_id_list', exp_id=exp.idexperiment) }}" role="button">Check ID</a> + {% endif %} + + </td> </tr> <tr> - <td>Language:</td> - <td>{{ exp.language }}</td> - <td></td> + <td> Research bulletin:</td> + <td> {{ exp.research_notification_filename }}</td> + {% if exp.research_notification_filename %} + <td> <a class="btn btn-primary btn-block btn-sm btn-info" href="{{ url_for('remove_research_notification', exp_id=exp.idexperiment) }}" role="button">Remove</a></td> + {% else %} + <td> <a class="btn btn-primary btn-block btn-sm btn-info" href="{{ url_for('upload_research_notification', exp_id=exp.idexperiment) }}" role="button">Upload</a></td> + {% endif %} </tr> - <tr> - <td>Stimulus type:</td> - <td>{{ mtype.type }}</td> - <td></td> + + <tr> + <td nowrap>Detailed instructions:</td> + <td>{{ exp.instruction }}</td> + <td nowrap> + <a class="btn btn-primary btn-block btn-sm btn-info" href="{{ url_for('edit_experiment', exp_id=exp.idexperiment) }}" role="button">Edit properties</a> + </td> </tr> <tr> - <td>Experiment ID:</td> + <td nowrap>Short description:</td> + <td>{{ exp.short_instruction }}</td> + <td nowrap></td> + </tr> + + <tr> + <td nowrap>Single sentence instruction:</td> + <td>{{ exp.single_sentence_instruction }}</td> + <td nowrap></td> + </tr> + + <tr> + <td nowrap>Consent form text:</td> + <td>{{ exp.consent_text }}</td> + <td nowrap></td> + </tr> + <tr> + <td nowrap>Experiment database ID:</td> <td>{{ exp.idexperiment }}</td> - <td></td> + <td nowrap></td> </tr> + + {% endfor %} </tbody> </table> @@ -100,10 +159,10 @@ <table class="table"> <tbody> <tr> - <td class="col-8"> + <td class="col-11"> <label for="{{ options[0] }}">{{ options[1] }}</label> <select required class="form-control" name="{{ options[0] }}"> - <option disabled selected value></option> + <option disabled selected value>Please select</option> {% for op in questions1[options] %} <option value="{{ op[0] }}" name="{{ op[0] }}">{{ op[0] }}</option> {% endfor %} @@ -218,7 +277,7 @@ <table class="table col-12"> <tbody> {% if mtype.type=='text' %} - {% for page in media.items %} + {% for page in media %} <tr class="col-12"> <td class="text-nowrap">Page ID: {{ page.idpage }} </td> @@ -260,7 +319,7 @@ {% else %} <div class="container col-12"> - {% for page in media.items %} + {% for page in media %} <tr class="col-12 text-left"> <td class="col-2 text-nowrap">Page ID: {{ page.idpage }} </td> diff --git a/app/templates/view_forced_id_list.html b/app/templates/view_forced_id_list.html new file mode 100644 index 0000000..f7127d9 --- /dev/null +++ b/app/templates/view_forced_id_list.html @@ -0,0 +1,49 @@ +{% extends "base.html" %} +{% block content %} + + + <h1 class="container mt-5 display-4 text-center"><br>Forced ID login for participants:</h1> + <br> + <p class="lead">By using forced ID login subjects can only participate to a rating task by logging in with a pregenerated ID. + </p> + <br> + + <form action="" method="post" role="form"> + <div class="form-inline"> + <div class="form-group"> + <label class="col-form-label" for="number">Generate</label> + <input required type="number" min="0" class="form-control ml-2" name="number" id="number" placeholder="number"> + <label class="col-form-label" for="name"> of random IDs starting with a</label> + <input type="text" class="form-control ml-2" name="string" id="string" placeholder="string"> + <label class="col-form-label" for="name"> for this experiment -> </label> + <button type="submit" class="btn btn-primary ml-3">Generate IDs</button> + </div> + </div> + <br> + </form> + +<h4 class="text-left"><br>Usable participant IDs for this experiment:</h1> +<br> + + +<div class="container col-12"> +<table class="table"> +<tbody> + + +{% for id in id_list %} + +<tr> +<td> +{{ id.pregenerated_id }} + +</td> +</tr> + + +{% endfor %} + +</tbody> +</table> + +{% endblock %} \ No newline at end of file diff --git a/app/templates/view_research_notification.html b/app/templates/view_research_notification.html new file mode 100644 index 0000000..f452f12 --- /dev/null +++ b/app/templates/view_research_notification.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block content %} + + +<br> + <div class="container stimulus col-{{stimulus_size}} mt-5 pt-5"> + + <img src="/{{ research_notification_filename }}" class="img-fluid"> + + </div> + + +{% endblock %} \ No newline at end of file diff --git a/app/translations/el/LC_MESSAGES/messages.mo b/app/translations/el/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..c17b67a75d1e960a4f129d99f437698ddf0dd9dc GIT binary patch literal 6449 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 literal 0 HcmV?d00001 diff --git a/app/translations/el/LC_MESSAGES/messages.po b/app/translations/el/LC_MESSAGES/messages.po new file mode 100644 index 0000000..19abfce --- /dev/null +++ b/app/translations/el/LC_MESSAGES/messages.po @@ -0,0 +1,290 @@ +# Greek translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-11-28 14:59+0200\n" +"PO-Revision-Date: 2018-11-27 16:38+0200\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: el\n" +"Language-Team: el <LL@li.org>\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: app/forms.py:36 +msgid "Continue rating" +msgstr "Συνεχίστε την εÏγασία βαθμολόγησης" + +#: app/forms.py:41 +msgid "Start rating" +msgstr "Είμαι Îτοιμος να ξεκινήσω" + +#: app/routes.py:359 +msgid "ID already in use" +msgstr "" + +#: app/routes.py:368 +msgid "No such ID set for this experiment" +msgstr "" + +#: app/templates/base.html:43 +msgid "Task progress:" +msgstr "" + +#: app/templates/begin_with_id.html:8 +msgid "Please insert your ID-code below:" +msgstr "ΠαÏακαλώ εισάγετε τον κωδικό σας εδω" + +#: app/templates/begin_with_id.html:12 app/templates/consent.html:29 +#: app/templates/instructions.html:14 app/templates/quit_task.html:4 +#: app/templates/quit_task.html:7 +msgid "Notice!" +msgstr "Î Ïοσοχή!" + +#: app/templates/begin_with_id.html:13 +msgid "" +"Participation in this experiment requires a login with a predetermined ID" +" code. Please input ID below." +msgstr "" + +#: app/templates/consent.html:11 +msgid "Consent for participation:" +msgstr "" + +#: app/templates/consent.html:14 +msgid "Research bulletin can be read" +msgstr "" + +#: app/templates/consent.html:14 +msgid "here." +msgstr "" + +#: app/templates/consent.html:20 +msgid "Agree" +msgstr "Συμφωνώ" + +#: app/templates/consent.html:21 +msgid "Disagree" +msgstr "Διαφωνώ" + +#: app/templates/consent.html:32 +msgid "" +"In order to participate for the study you need to agree with the terms " +"presented." +msgstr "" +"Για να συμμετάσχετε στο πείÏαμα, Ï€ÏÎπει να αποδεχθείτε τους ÏŒÏους " +"συμμετοχής." + +#: app/templates/consent.html:35 +msgid "Close Notice" +msgstr "Κλείσε την ενημÎÏωση" + +#: app/templates/consent.html:36 app/templates/task_completed.html:15 +msgid "Return Home" +msgstr "Πίσω στην ΑÏχική Σελίδα" + +#: app/templates/continue_task.html:9 +msgid "Please insert your participant ID:" +msgstr "ΠαÏακαλώ εισάγετε τον κωδικό αναγνώÏισης σας" + +#: app/templates/index.html:6 +msgid "Welcome to Onni" +msgstr "Καλώς ήÏθατε" + +#: app/templates/index.html:9 +msgid "" +"This is the Human Emotion Systems laboratorys stimulus rating tool. If " +"you have previously started a rating task you can continue that task on " +"this page. If you are a researcher you can create new rating tasks by " +"logging in. Or you can start a new rating task and start rating by " +"selecting a task from the database list below." +msgstr "" +"Αυτό είναι το εÏγαλείο βαθμολόγησης των εÏεθισμάτων του εÏγαστηÏίου των " +"ανθÏώπινων συναισθημάτων. Εάν Îχετε ήδη ξεκινήσει μια εÏγασία " +"βαθμολόγησης, μποÏείτε να συνεχίσετε την εÏγασία αυτή σε αυτή τη σελίδα. " +"Αν είστε εÏευνητής, μποÏείτε να δημιουÏγήσετε νÎες εÏγασίες αξιολόγησης " +"συνδεόμενοι με το σÏστημα. Ή μποÏείτε να ξεκινήσετε μια νÎα αξιολόγηση " +"και να ξεκινήσετε την αξιολόγηση επιλÎγοντας μια εÏγασία αξιολόγησης από " +"την παÏακάτω λίστα βάσης δεδομÎνων" + +#: app/templates/index.html:13 +msgid "" +"You can choose the language suitable for you from the language menu in " +"the upper right corner" +msgstr "" + +#: app/templates/index.html:18 +msgid "List of experiments in database:" +msgstr "Λίστα των πειÏαμάτων" + +#: app/templates/index.html:25 app/templates/index.html:61 +msgid "Name:" +msgstr "" + +#: app/templates/index.html:26 app/templates/index.html:62 +msgid "Instruction:" +msgstr "" + +#: app/templates/index.html:34 app/templates/index.html:69 +msgid "Participation ID is required for this task." +msgstr "" + +#: app/templates/index.html:40 app/templates/index.html:75 +msgid "Begin task" +msgstr "Ξεκίνα την άσκηση" + +#: app/templates/index.html:41 app/templates/index.html:76 +msgid "Continue task" +msgstr "ΣυνÎχιση της εÏγασίας" + +#: app/templates/index.html:45 app/templates/index.html:80 +msgid "AdminRun" +msgstr "" + +#: app/templates/index.html:46 app/templates/index.html:81 +msgid "Statistics" +msgstr "" + +#: app/templates/index.html:47 app/templates/index.html:82 +msgid "View / Edit" +msgstr "" + +#: app/templates/instructions.html:4 +msgid "Instructions:" +msgstr "" + +#: app/templates/instructions.html:15 +msgid "" +"If you wish to quit a rating task before it is fully completed, you can " +"return to finish the task later but you will need your participant ID-" +"number in order to do that. Please save your participant ID before " +"starting the rating task!" +msgstr "" +"Αν θÎλετε να τεÏματίσετε μια εÏγασία βαθμολόγησης Ï€Ïιν ολοκληÏωθεί, " +"μποÏείτε να επιστÏÎψετε για να ολοκληÏώσετε την εÏγασία αÏγότεÏα, αλλά θα" +" χÏειαστείτε τον κωδικό αναγνώÏισης του συμμετÎχοντα για να το κάνετε " +"αυτό. ΑποθηκεÏστε τον κωδικό αναγνώÏισης Ï€Ïιν ξεκινήσετε την εÏγασία " +"αξιολόγησης!" + +#: app/templates/instructions.html:18 app/templates/quit_task.html:11 +msgid "Your participant ID is:" +msgstr "Ο κωδικός αναγνώÏισης σας είναι" + +#: app/templates/instructions.html:21 +msgid "Ready to start" +msgstr "Είμαι Îτοιμος να ξεκινήσω" + +#: app/templates/quit_task.html:8 +msgid "" +"Please write down your participant ID so you can return and finish the " +"rating task later!" +msgstr "" +"ΠαÏακαλώ αποθηκεÏστε τον κωδικό αναγνώÏισης σας Îτσι ώστε να μποÏείτε να " +"γυÏίσετε και να συνεχίσετε την εÏγασία βαθμολόγησης αÏγότεÏα!" + +#: app/templates/quit_task.html:14 +msgid "Quit!" +msgstr "Εγκαταλείπω την εÏγασία" + +#: app/templates/register.html:6 +msgid "This is the registration page." +msgstr "Αυτή είναι η σελίδα εγγÏαφής" + +#: app/templates/register.html:7 +msgid "Please fill in these background questions before starting the rating task:" +msgstr "" +"ΠαÏακαλώ απαντήστε σε αυτÎÏ‚ τις εισαγωγικÎÏ‚ εÏωτήσεις Ï€Ïιν ξεκινήσετε την" +" εÏγασία" + +#: app/templates/register.html:14 +msgid "Please select" +msgstr "" + +#: app/templates/register.html:22 +msgid "Submit" +msgstr "Υποβολή" + +#: app/templates/task.html:127 +msgid "Quit task" +msgstr "Εγκαταλείπω την εÏγασία" + +#: app/templates/task.html:128 +msgid "Next page" +msgstr "Επόμενη σελίδα" + +#: app/templates/task.html:132 +msgid "" +"You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or " +"⌘+/⌘- (Mac)" +msgstr "" + +#: app/templates/task_completed.html:7 +msgid "Task completed!" +msgstr "Η εÏγασία ολοκληÏώθηκε!" + +#: app/templates/task_completed.html:11 +msgid "You have completed the rating task. Thank you for your participation." +msgstr "" +"‘Εχετε ολοκληÏώσει την εÏγασία βαθμολόγησης. Σας ευχαÏιστοÏμε για τη " +"συμμετοχή σας " + +#: app/templates/test_page.html:7 +msgid "File Not Found" +msgstr "" + +#~ msgid "ID number:" +#~ msgstr "" + +#~ msgid "Language:" +#~ msgstr "" + +#~ msgid "Status:" +#~ msgstr "" + +#~ msgid "Welcome to Onni" +#~ msgstr "" + +#~ msgid "" +#~ "This is the Human Emotion Systems " +#~ "laboratorys stimulus rating tool. If you" +#~ " have previously started a rating " +#~ "task you can continue that task on" +#~ " this page. If you are a " +#~ "researcher you can create new rating " +#~ "tasks by logging in. Or you can" +#~ " start a new rating task and " +#~ "start rating by selecting a task " +#~ "from the database list below." +#~ msgstr "" + +#~ msgid "" +#~ "You can choose the language suitable " +#~ "for you from the language menu in" +#~ " the upper right corner" +#~ msgstr "" + +#~ msgid "List of experiments in database:" +#~ msgstr "" + +#~ msgid "Name:" +#~ msgstr "" + +#~ msgid "Instruction:" +#~ msgstr "" + +#~ msgid "Participation ID is required for this task." +#~ msgstr "" + +#~ msgid "Begin task" +#~ msgstr "" + +#~ msgid "Continue task" +#~ msgstr "" + diff --git a/app/translations/en/LC_MESSAGES/messages.mo b/app/translations/en/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..7e74cd37c37c13f5379212843af7a99dd9a2b35d GIT binary patch literal 4705 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 Cj<8bz literal 0 HcmV?d00001 diff --git a/app/translations/en/LC_MESSAGES/messages.po b/app/translations/en/LC_MESSAGES/messages.po new file mode 100644 index 0000000..16a75e0 --- /dev/null +++ b/app/translations/en/LC_MESSAGES/messages.po @@ -0,0 +1,270 @@ +# English translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-11-28 14:59+0200\n" +"PO-Revision-Date: 2018-11-27 16:38+0200\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: en\n" +"Language-Team: en <LL@li.org>\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: app/forms.py:36 +msgid "Continue rating" +msgstr "" + +#: app/forms.py:41 +msgid "Start rating" +msgstr "" + +#: app/routes.py:359 +msgid "ID already in use" +msgstr "" + +#: app/routes.py:368 +msgid "No such ID set for this experiment" +msgstr "" + +#: app/templates/base.html:43 +msgid "Task progress:" +msgstr "" + +#: app/templates/begin_with_id.html:8 +msgid "Please insert your ID-code below:" +msgstr "" + +#: app/templates/begin_with_id.html:12 app/templates/consent.html:29 +#: app/templates/instructions.html:14 app/templates/quit_task.html:4 +#: app/templates/quit_task.html:7 +msgid "Notice!" +msgstr "" + +#: app/templates/begin_with_id.html:13 +msgid "" +"Participation in this experiment requires a login with a predetermined ID" +" code. Please input ID below." +msgstr "" + +#: app/templates/consent.html:11 +msgid "Consent for participation:" +msgstr "" + +#: app/templates/consent.html:14 +msgid "Research bulletin can be read" +msgstr "" + +#: app/templates/consent.html:14 +msgid "here." +msgstr "" + +#: app/templates/consent.html:20 +msgid "Agree" +msgstr "" + +#: app/templates/consent.html:21 +msgid "Disagree" +msgstr "" + +#: app/templates/consent.html:32 +msgid "" +"In order to participate for the study you need to agree with the terms " +"presented." +msgstr "" + +#: app/templates/consent.html:35 +msgid "Close Notice" +msgstr "" + +#: app/templates/consent.html:36 app/templates/task_completed.html:15 +msgid "Return Home" +msgstr "" + +#: app/templates/continue_task.html:9 +msgid "Please insert your participant ID:" +msgstr "" + +#: app/templates/index.html:6 +msgid "Welcome to Onni" +msgstr "" + +#: app/templates/index.html:9 +msgid "" +"This is the Human Emotion Systems laboratorys stimulus rating tool. If " +"you have previously started a rating task you can continue that task on " +"this page. If you are a researcher you can create new rating tasks by " +"logging in. Or you can start a new rating task and start rating by " +"selecting a task from the database list below." +msgstr "" + +#: app/templates/index.html:13 +msgid "" +"You can choose the language suitable for you from the language menu in " +"the upper right corner" +msgstr "" + +#: app/templates/index.html:18 +msgid "List of experiments in database:" +msgstr "" + +#: app/templates/index.html:25 app/templates/index.html:61 +msgid "Name:" +msgstr "" + +#: app/templates/index.html:26 app/templates/index.html:62 +msgid "Instruction:" +msgstr "" + +#: app/templates/index.html:34 app/templates/index.html:69 +msgid "Participation ID is required for this task." +msgstr "" + +#: app/templates/index.html:40 app/templates/index.html:75 +msgid "Begin task" +msgstr "" + +#: app/templates/index.html:41 app/templates/index.html:76 +msgid "Continue task" +msgstr "" + +#: app/templates/index.html:45 app/templates/index.html:80 +msgid "AdminRun" +msgstr "" + +#: app/templates/index.html:46 app/templates/index.html:81 +msgid "Statistics" +msgstr "" + +#: app/templates/index.html:47 app/templates/index.html:82 +msgid "View / Edit" +msgstr "" + +#: app/templates/instructions.html:4 +msgid "Instructions:" +msgstr "" + +#: app/templates/instructions.html:15 +msgid "" +"If you wish to quit a rating task before it is fully completed, you can " +"return to finish the task later but you will need your participant ID-" +"number in order to do that. Please save your participant ID before " +"starting the rating task!" +msgstr "" + +#: app/templates/instructions.html:18 app/templates/quit_task.html:11 +msgid "Your participant ID is:" +msgstr "" + +#: app/templates/instructions.html:21 +msgid "Ready to start" +msgstr "" + +#: app/templates/quit_task.html:8 +msgid "" +"Please write down your participant ID so you can return and finish the " +"rating task later!" +msgstr "" + +#: app/templates/quit_task.html:14 +msgid "Quit!" +msgstr "" + +#: app/templates/register.html:6 +msgid "This is the registration page." +msgstr "" + +#: app/templates/register.html:7 +msgid "Please fill in these background questions before starting the rating task:" +msgstr "" + +#: app/templates/register.html:14 +msgid "Please select" +msgstr "" + +#: app/templates/register.html:22 +msgid "Submit" +msgstr "" + +#: app/templates/task.html:127 +msgid "Quit task" +msgstr "" + +#: app/templates/task.html:128 +msgid "Next page" +msgstr "" + +#: app/templates/task.html:132 +msgid "" +"You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or " +"⌘+/⌘- (Mac)" +msgstr "" + +#: app/templates/task_completed.html:7 +msgid "Task completed!" +msgstr "" + +#: app/templates/task_completed.html:11 +msgid "You have completed the rating task. Thank you for your participation." +msgstr "" + +#: app/templates/test_page.html:7 +msgid "File Not Found" +msgstr "" + +#~ msgid "ID number:" +#~ msgstr "" + +#~ msgid "Language:" +#~ msgstr "" + +#~ msgid "Status:" +#~ msgstr "" + +#~ msgid "Welcome to Onni" +#~ msgstr "" + +#~ msgid "" +#~ "This is the Human Emotion Systems " +#~ "laboratorys stimulus rating tool. If you" +#~ " have previously started a rating " +#~ "task you can continue that task on" +#~ " this page. If you are a " +#~ "researcher you can create new rating " +#~ "tasks by logging in. Or you can" +#~ " start a new rating task and " +#~ "start rating by selecting a task " +#~ "from the database list below." +#~ msgstr "" + +#~ msgid "" +#~ "You can choose the language suitable " +#~ "for you from the language menu in" +#~ " the upper right corner" +#~ msgstr "" + +#~ msgid "List of experiments in database:" +#~ msgstr "" + +#~ msgid "Name:" +#~ msgstr "" + +#~ msgid "Instruction:" +#~ msgstr "" + +#~ msgid "Participation ID is required for this task." +#~ msgstr "" + +#~ msgid "Begin task" +#~ msgstr "" + +#~ msgid "Continue task" +#~ msgstr "" + diff --git a/app/translations/fa/LC_MESSAGES/messages.mo b/app/translations/fa/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..2b8f7a6fed6c73200e0d101caa0d0fd052414a10 GIT binary patch literal 5544 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 VZRh=<C>i6)x$9kSc6Z+2{|PWZO&S0I literal 0 HcmV?d00001 diff --git a/app/translations/fa/LC_MESSAGES/messages.po b/app/translations/fa/LC_MESSAGES/messages.po new file mode 100644 index 0000000..6ecbb8d --- /dev/null +++ b/app/translations/fa/LC_MESSAGES/messages.po @@ -0,0 +1,280 @@ +# Persian translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-11-28 14:59+0200\n" +"PO-Revision-Date: 2018-11-27 16:38+0200\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: fa\n" +"Language-Team: fa <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: app/forms.py:36 +msgid "Continue rating" +msgstr "ادامه امتیازدهی" + +#: app/forms.py:41 +msgid "Start rating" +msgstr "برای شروع آزمایش آماده ام" + +#: app/routes.py:359 +msgid "ID already in use" +msgstr "" + +#: app/routes.py:368 +msgid "No such ID set for this experiment" +msgstr "" + +#: app/templates/base.html:43 +msgid "Task progress:" +msgstr "" + +#: app/templates/begin_with_id.html:8 +msgid "Please insert your ID-code below:" +msgstr "لطÙا شناسه خود را اینجا وارد کنید:" + +#: app/templates/begin_with_id.html:12 app/templates/consent.html:29 +#: app/templates/instructions.html:14 app/templates/quit_task.html:4 +#: app/templates/quit_task.html:7 +msgid "Notice!" +msgstr "توجه!" + +#: app/templates/begin_with_id.html:13 +msgid "" +"Participation in this experiment requires a login with a predetermined ID" +" code. Please input ID below." +msgstr "" + +#: app/templates/consent.html:11 +msgid "Consent for participation:" +msgstr "" + +#: app/templates/consent.html:14 +msgid "Research bulletin can be read" +msgstr "" + +#: app/templates/consent.html:14 +msgid "here." +msgstr "" + +#: app/templates/consent.html:20 +msgid "Agree" +msgstr "مواÙقم" + +#: app/templates/consent.html:21 +msgid "Disagree" +msgstr "مواÙÙ‚ نیستم" + +#: app/templates/consent.html:32 +msgid "" +"In order to participate for the study you need to agree with the terms " +"presented." +msgstr "برای شرکت در این آزمایش باید مواÙقت خود را با این موارد اعلام کنید." + +#: app/templates/consent.html:35 +msgid "Close Notice" +msgstr "بستن توجه" + +#: app/templates/consent.html:36 app/templates/task_completed.html:15 +msgid "Return Home" +msgstr "بازگشت به صÙØÙ‡ اصلی" + +#: app/templates/continue_task.html:9 +msgid "Please insert your participant ID:" +msgstr "لطÙا شناسه خود را اینجا وارد کنید:" + +#: app/templates/index.html:6 +msgid "Welcome to Onni" +msgstr "خوش آمدید" + +#: app/templates/index.html:9 +msgid "" +"This is the Human Emotion Systems laboratorys stimulus rating tool. If " +"you have previously started a rating task you can continue that task on " +"this page. If you are a researcher you can create new rating tasks by " +"logging in. Or you can start a new rating task and start rating by " +"selecting a task from the database list below." +msgstr "" +"این صÙØÙ‡ مربوط به امتیازدهی به Ù…Øرک ها در گروه تØقیقاتی سیسنم اØساسات " +"انسانها Ù…ÛŒ باشد. چنانچه شما قبلا وارد این سامانه شده اید میتوانید در این " +"صÙØÙ‡ به ادامه بپردازید. اگر شما یکی از پژوهشگرهای گروه هستید Ù…ÛŒ توانید با" +" ورود به سامانه سیستم امتیازدهی خود را طراØÛŒ کنید." + +#: app/templates/index.html:13 +msgid "" +"You can choose the language suitable for you from the language menu in " +"the upper right corner" +msgstr "" + +#: app/templates/index.html:18 +msgid "List of experiments in database:" +msgstr "لیست تØقیقات موجود در بانک اطلاعاتی::" + +#: app/templates/index.html:25 app/templates/index.html:61 +msgid "Name:" +msgstr "" + +#: app/templates/index.html:26 app/templates/index.html:62 +msgid "Instruction:" +msgstr "" + +#: app/templates/index.html:34 app/templates/index.html:69 +msgid "Participation ID is required for this task." +msgstr "" + +#: app/templates/index.html:40 app/templates/index.html:75 +msgid "Begin task" +msgstr "آزمایش را شروع کنید" + +#: app/templates/index.html:41 app/templates/index.html:76 +msgid "Continue task" +msgstr "ادامه آزمایش" + +#: app/templates/index.html:45 app/templates/index.html:80 +msgid "AdminRun" +msgstr "" + +#: app/templates/index.html:46 app/templates/index.html:81 +msgid "Statistics" +msgstr "" + +#: app/templates/index.html:47 app/templates/index.html:82 +msgid "View / Edit" +msgstr "" + +#: app/templates/instructions.html:4 +msgid "Instructions:" +msgstr "" + +#: app/templates/instructions.html:15 +msgid "" +"If you wish to quit a rating task before it is fully completed, you can " +"return to finish the task later but you will need your participant ID-" +"number in order to do that. Please save your participant ID before " +"starting the rating task!" +msgstr "" +"چنانچه مایل به خروج از بخش امتیازدهی پیش از تکمیل این بخش Ù…ÛŒ باشید شما Ù…ÛŒ" +" توانید بعدا به منظور اتمام این بخش به این صÙØÙ‡ برگردید. برای انجام این " +"کار شما به کد شناسایی خود نیاز دارید. لذا لطÙا پیش از شروع آزمایش کد " +"شناسایی خود را ذخیره کنید. " + +#: app/templates/instructions.html:18 app/templates/quit_task.html:11 +msgid "Your participant ID is:" +msgstr "کد شناسایی شما" + +#: app/templates/instructions.html:21 +msgid "Ready to start" +msgstr "برای شروع آزمایش آماده ام" + +#: app/templates/quit_task.html:8 +msgid "" +"Please write down your participant ID so you can return and finish the " +"rating task later!" +msgstr "" +"لطÙا شناسه خود را یادداشت نمایید تا در صورت نیاز در زمان دیگری امتیازدهی " +"را به اتمام برسانید" + +#: app/templates/quit_task.html:14 +msgid "Quit!" +msgstr "خروج" + +#: app/templates/register.html:6 +msgid "This is the registration page." +msgstr "صÙØÙ‡ ثبت نام" + +#: app/templates/register.html:7 +msgid "Please fill in these background questions before starting the rating task:" +msgstr "لطÙا قبل از شروع امتیازدهی به سوالات زمینه پاسخ دهید" + +#: app/templates/register.html:14 +msgid "Please select" +msgstr "" + +#: app/templates/register.html:22 +msgid "Submit" +msgstr "ارسال" + +#: app/templates/task.html:127 +msgid "Quit task" +msgstr "خروج از آزمایش" + +#: app/templates/task.html:128 +msgid "Next page" +msgstr "صÙØÙ‡ بعد" + +#: app/templates/task.html:132 +msgid "" +"You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or " +"⌘+/⌘- (Mac)" +msgstr "" + +#: app/templates/task_completed.html:7 +msgid "Task completed!" +msgstr "عملیات با موÙقیت انجام شد!" + +#: app/templates/task_completed.html:11 +msgid "You have completed the rating task. Thank you for your participation." +msgstr "بخش امتیازدهی با موÙقیت انجام شد. سپاس ازمشارکت شما در این بخش" + +#: app/templates/test_page.html:7 +msgid "File Not Found" +msgstr "" + +#~ msgid "ID number:" +#~ msgstr "" + +#~ msgid "Language:" +#~ msgstr "" + +#~ msgid "Status:" +#~ msgstr "" + +#~ msgid "Welcome to Onni" +#~ msgstr "" + +#~ msgid "" +#~ "This is the Human Emotion Systems " +#~ "laboratorys stimulus rating tool. If you" +#~ " have previously started a rating " +#~ "task you can continue that task on" +#~ " this page. If you are a " +#~ "researcher you can create new rating " +#~ "tasks by logging in. Or you can" +#~ " start a new rating task and " +#~ "start rating by selecting a task " +#~ "from the database list below." +#~ msgstr "" + +#~ msgid "" +#~ "You can choose the language suitable " +#~ "for you from the language menu in" +#~ " the upper right corner" +#~ msgstr "" + +#~ msgid "List of experiments in database:" +#~ msgstr "" + +#~ msgid "Name:" +#~ msgstr "" + +#~ msgid "Instruction:" +#~ msgstr "" + +#~ msgid "Participation ID is required for this task." +#~ msgstr "" + +#~ msgid "Begin task" +#~ msgstr "" + +#~ msgid "Continue task" +#~ msgstr "" + diff --git a/app/translations/fi/LC_MESSAGES/messages.mo b/app/translations/fi/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..a95738971ca115e7d99054bb272894bbec3799bc GIT binary patch literal 4666 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 B-c<kq literal 0 HcmV?d00001 diff --git a/app/translations/fi/LC_MESSAGES/messages.po b/app/translations/fi/LC_MESSAGES/messages.po new file mode 100644 index 0000000..77adc3f --- /dev/null +++ b/app/translations/fi/LC_MESSAGES/messages.po @@ -0,0 +1,281 @@ +# Finnish translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-11-28 14:59+0200\n" +"PO-Revision-Date: 2018-11-27 16:38+0200\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: fi\n" +"Language-Team: fi <LL@li.org>\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: app/forms.py:36 +msgid "Continue rating" +msgstr "Jatka tehtävää" + +#: app/forms.py:41 +msgid "Start rating" +msgstr "Aloita" + +#: app/routes.py:359 +msgid "ID already in use" +msgstr "Kyseinen ID on jo käytössä" + +#: app/routes.py:368 +msgid "No such ID set for this experiment" +msgstr "Kyseistä ID:tä ei löydy" + +#: app/templates/base.html:43 +msgid "Task progress:" +msgstr "Kokeesta tehty:" + +#: app/templates/begin_with_id.html:8 +msgid "Please insert your ID-code below:" +msgstr "Syötä koehenkilötunnuksesi:" + +#: app/templates/begin_with_id.html:12 app/templates/consent.html:29 +#: app/templates/instructions.html:14 app/templates/quit_task.html:4 +#: app/templates/quit_task.html:7 +msgid "Notice!" +msgstr "Huom!" + +#: app/templates/begin_with_id.html:13 +msgid "" +"Participation in this experiment requires a login with a predetermined ID" +" code. Please input ID below." +msgstr "" +"Tähän kokeeseen osallistumiseen vaaditaan ID-tunnus. Syötä ID-tunnuksesi " +"alla olevaan kenttään." + +#: app/templates/consent.html:11 +msgid "Consent for participation:" +msgstr "Suostumus osallistumiseksi:" + +#: app/templates/consent.html:14 +msgid "Research bulletin can be read" +msgstr "Tutkimustiedote on luettavissa" + +#: app/templates/consent.html:14 +msgid "here." +msgstr "täällä" + +#: app/templates/consent.html:20 +msgid "Agree" +msgstr "Suostun" + +#: app/templates/consent.html:21 +msgid "Disagree" +msgstr "En suostu" + +#: app/templates/consent.html:32 +msgid "" +"In order to participate for the study you need to agree with the terms " +"presented." +msgstr "Osallistuaksesi kokeeseen sinun on hyväksyttävä esitetyt ehdot." + +#: app/templates/consent.html:35 +msgid "Close Notice" +msgstr "Sulje" + +#: app/templates/consent.html:36 app/templates/task_completed.html:15 +msgid "Return Home" +msgstr "Palaa etusivulle" + +#: app/templates/continue_task.html:9 +msgid "Please insert your participant ID:" +msgstr "Syötä ID-tunnuksesi:" + +#: app/templates/index.html:6 +msgid "Welcome to Onni" +msgstr "Tervetuloa" + +#: app/templates/index.html:9 +msgid "" +"This is the Human Emotion Systems laboratorys stimulus rating tool. If " +"you have previously started a rating task you can continue that task on " +"this page. If you are a researcher you can create new rating tasks by " +"logging in. Or you can start a new rating task and start rating by " +"selecting a task from the database list below." +msgstr "" +"Tämä on Human Emotion Systems Laboratoryn arviointityökalu. Jos olet " +"aiemmin aloittanut arviointitehtävän voit jatkaa tehtävää tällä sivulla. " +"Jos olet tutkija voit luoda uuden arviointitehtävän kirjautumalla sisään." +" Tai voit aloittaa uuden arvointitehtävän ja aloittaa arvioinnin " +"valitsemalla arviointitehtävän alla olevasta listasta." + +#: app/templates/index.html:13 +msgid "" +"You can choose the language suitable for you from the language menu in " +"the upper right corner" +msgstr "Voit valita kielen oikeassa yläkulmassa olevasta language-valikosta" + +#: app/templates/index.html:18 +msgid "List of experiments in database:" +msgstr "Tietokannassa olevat kokeet:" + +#: app/templates/index.html:25 app/templates/index.html:61 +msgid "Name:" +msgstr "Nimi:" + +#: app/templates/index.html:26 app/templates/index.html:62 +msgid "Instruction:" +msgstr "Ohjeet:" + +#: app/templates/index.html:34 app/templates/index.html:69 +msgid "Participation ID is required for this task." +msgstr "Tähän kokeeseen osallistumiseen vaaditaan ID-tunnus." + +#: app/templates/index.html:40 app/templates/index.html:75 +msgid "Begin task" +msgstr "Aloita" + +#: app/templates/index.html:41 app/templates/index.html:76 +msgid "Continue task" +msgstr "Jatka" + +#: app/templates/index.html:45 app/templates/index.html:80 +msgid "AdminRun" +msgstr "AdminRun" + +#: app/templates/index.html:46 app/templates/index.html:81 +msgid "Statistics" +msgstr "Statistics" + +#: app/templates/index.html:47 app/templates/index.html:82 +msgid "View / Edit" +msgstr "View / Edit" + +#: app/templates/instructions.html:4 +msgid "Instructions:" +msgstr "Ohjeet:" + +#: app/templates/instructions.html:15 +msgid "" +"If you wish to quit a rating task before it is fully completed, you can " +"return to finish the task later but you will need your participant ID-" +"number in order to do that. Please save your participant ID before " +"starting the rating task!" +msgstr "" + +#: app/templates/instructions.html:18 app/templates/quit_task.html:11 +msgid "Your participant ID is:" +msgstr "ID-numerosi on:" + +#: app/templates/instructions.html:21 +msgid "Ready to start" +msgstr "Olen valmis aloittamaan" + +#: app/templates/quit_task.html:8 +msgid "" +"Please write down your participant ID so you can return and finish the " +"rating task later!" +msgstr "" +"Kirjoita ID-numerosi ylös jotta voit palata jatkamaan arviointitehtävää " +"tarvittaessa myöhemmin!" + +#: app/templates/quit_task.html:14 +msgid "Quit!" +msgstr "Lopeta!" + +#: app/templates/register.html:6 +msgid "This is the registration page." +msgstr "Rekisteröityminen" + +#: app/templates/register.html:7 +msgid "Please fill in these background questions before starting the rating task:" +msgstr "Ennen tehtävän aloittamista, vastaa näihin taustakysymyksiin:" + +#: app/templates/register.html:14 +msgid "Please select" +msgstr "Valitse" + +#: app/templates/register.html:22 +msgid "Submit" +msgstr "Jatka" + +#: app/templates/task.html:127 +msgid "Quit task" +msgstr "Lopeta" + +#: app/templates/task.html:128 +msgid "Next page" +msgstr "Seuraava" + +#: app/templates/task.html:132 +msgid "" +"You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or " +"⌘+/⌘- (Mac)" +msgstr "" +"Voit zoomata sivunäkymää isommaksi/pienemmäksi painamalla ctrl+/ctrl- " +"(Windows) tai ⌘+/⌘- (Mac)" + +#: app/templates/task_completed.html:7 +msgid "Task completed!" +msgstr "Tehtävä on valmis!" + +#: app/templates/task_completed.html:11 +msgid "You have completed the rating task. Thank you for your participation." +msgstr "Olet suorittanut tämän arviointitehtävän. Kiitos osallistumisestasi." + +#: app/templates/test_page.html:7 +msgid "File Not Found" +msgstr "" + +#~ msgid "Welcome to Onni" +#~ msgstr "Tervetuloa" + +#~ msgid "" +#~ "This is the Human Emotion Systems " +#~ "laboratorys stimulus rating tool. If you" +#~ " have previously started a rating " +#~ "task you can continue that task on" +#~ " this page. If you are a " +#~ "researcher you can create new rating " +#~ "tasks by logging in. Or you can" +#~ " start a new rating task and " +#~ "start rating by selecting a task " +#~ "from the database list below." +#~ msgstr "" +#~ "Tämä on Human Emotion Systems " +#~ "Laboratoryn arviointityökalu.Jos olet aiemmin " +#~ "aloittanut arviointitehtävän voit jatkaa " +#~ "tehtävää tällä sivulla. Jos olet tutkija" +#~ " voit luoda uuden arviointitehtävän " +#~ "kirjautumalla sisään. Tai voit aloittaa " +#~ "uuden arvointitehtävän ja aloittaa arvioinnin" +#~ " valitsemalla arviointitehtävän alla olevasta " +#~ "listasta." + +#~ msgid "" +#~ "You can choose the language suitable " +#~ "for you from the language menu in" +#~ " the upper right corner" +#~ msgstr "Voit vaihtaa kieltä oikeassa yläkulmassa olevasta valikosta." + +#~ msgid "List of experiments in database:" +#~ msgstr "Tietokannassa olevat kokeet:" + +#~ msgid "Name:" +#~ msgstr "Nimi:" + +#~ msgid "Instruction:" +#~ msgstr "Ohjeet:" + +#~ msgid "Participation ID is required for this task." +#~ msgstr "Tähän kokeeseen osallistumiseen tarvitaan koehenkilötunnus" + +#~ msgid "Begin task" +#~ msgstr "Aloita" + +#~ msgid "Continue task" +#~ msgstr "Jatka" + diff --git a/app/translations/fin/LC_MESSAGES/messages.mo b/app/translations/fin/LC_MESSAGES/messages.mo deleted file mode 100644 index 699bab536246627e73eee1a2fea29e5490bf4da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484 zcmaJ-O-sW-6pSJWIePZ+yeYahsb3{+O21NxB(|in9%b9U#z?vwHk)F9hxp^X_*;Bc zv3l{rurtf>W_RBAc3usdZNfg`WG#M8gZM7NCA@4IhDWDKcq4AyV>XowG=@q(;Z!q! z#>S|MR0;=%(cs4G#xVAxkw3UKBh01JEG&|A#yVwEuvj|ag>64*wR^qD8;#82AZA^K zT+;^D;~E{PT6T@uHnYybzH-hkj;*R?kXOxH>O`T|~P7Ar1_jBBYJ=-&ka+_pmx z8h@gjX23;K@`NJi=|kWD(JV&3_`ZZj5VW$iB305fhgqq3#`;n%3I{~~DGRq+hcD_L z3OI1VJ~Bf;^ftxV70c{Op;6G&RyhS~eAcIV##2#;=_6MKYPZyLR@?a2Uznp}o|wv6 lDiQ~3lT@46C{R&P)ac5A4xeBK)ygF$7%{3P>N1nu_y946huZ)E diff --git a/app/translations/fin/LC_MESSAGES/messages.po b/app/translations/fin/LC_MESSAGES/messages.po deleted file mode 100644 index 5d1d64e..0000000 --- a/app/translations/fin/LC_MESSAGES/messages.po +++ /dev/null @@ -1,24 +0,0 @@ -# Finnish (Finland) translations for PROJECT. -# Copyright (C) 2018 ORGANIZATION -# This file is distributed under the same license as the PROJECT project. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-11-04 17:35+0200\n" -"PO-Revision-Date: 2018-11-04 17:35+0200\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: fi_FI\n" -"Language-Team: fi_FI <LL@li.org>\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" - -#: app/templates/index.html:5 -msgid "Welcome" -msgstr "Tervetuloa" - diff --git a/app/translations/it/LC_MESSAGES/messages.mo b/app/translations/it/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..279cea7af6189b542ed597194d4e14c657964701 GIT binary patch literal 4705 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 Bux9`O literal 0 HcmV?d00001 diff --git a/app/translations/it/LC_MESSAGES/messages.po b/app/translations/it/LC_MESSAGES/messages.po new file mode 100644 index 0000000..69b586b --- /dev/null +++ b/app/translations/it/LC_MESSAGES/messages.po @@ -0,0 +1,270 @@ +# Italian translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-11-28 14:59+0200\n" +"PO-Revision-Date: 2018-11-27 16:38+0200\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: it\n" +"Language-Team: it <LL@li.org>\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: app/forms.py:36 +msgid "Continue rating" +msgstr "" + +#: app/forms.py:41 +msgid "Start rating" +msgstr "" + +#: app/routes.py:359 +msgid "ID already in use" +msgstr "" + +#: app/routes.py:368 +msgid "No such ID set for this experiment" +msgstr "" + +#: app/templates/base.html:43 +msgid "Task progress:" +msgstr "" + +#: app/templates/begin_with_id.html:8 +msgid "Please insert your ID-code below:" +msgstr "" + +#: app/templates/begin_with_id.html:12 app/templates/consent.html:29 +#: app/templates/instructions.html:14 app/templates/quit_task.html:4 +#: app/templates/quit_task.html:7 +msgid "Notice!" +msgstr "" + +#: app/templates/begin_with_id.html:13 +msgid "" +"Participation in this experiment requires a login with a predetermined ID" +" code. Please input ID below." +msgstr "" + +#: app/templates/consent.html:11 +msgid "Consent for participation:" +msgstr "" + +#: app/templates/consent.html:14 +msgid "Research bulletin can be read" +msgstr "" + +#: app/templates/consent.html:14 +msgid "here." +msgstr "" + +#: app/templates/consent.html:20 +msgid "Agree" +msgstr "" + +#: app/templates/consent.html:21 +msgid "Disagree" +msgstr "" + +#: app/templates/consent.html:32 +msgid "" +"In order to participate for the study you need to agree with the terms " +"presented." +msgstr "" + +#: app/templates/consent.html:35 +msgid "Close Notice" +msgstr "" + +#: app/templates/consent.html:36 app/templates/task_completed.html:15 +msgid "Return Home" +msgstr "" + +#: app/templates/continue_task.html:9 +msgid "Please insert your participant ID:" +msgstr "" + +#: app/templates/index.html:6 +msgid "Welcome to Onni" +msgstr "" + +#: app/templates/index.html:9 +msgid "" +"This is the Human Emotion Systems laboratorys stimulus rating tool. If " +"you have previously started a rating task you can continue that task on " +"this page. If you are a researcher you can create new rating tasks by " +"logging in. Or you can start a new rating task and start rating by " +"selecting a task from the database list below." +msgstr "" + +#: app/templates/index.html:13 +msgid "" +"You can choose the language suitable for you from the language menu in " +"the upper right corner" +msgstr "" + +#: app/templates/index.html:18 +msgid "List of experiments in database:" +msgstr "" + +#: app/templates/index.html:25 app/templates/index.html:61 +msgid "Name:" +msgstr "" + +#: app/templates/index.html:26 app/templates/index.html:62 +msgid "Instruction:" +msgstr "" + +#: app/templates/index.html:34 app/templates/index.html:69 +msgid "Participation ID is required for this task." +msgstr "" + +#: app/templates/index.html:40 app/templates/index.html:75 +msgid "Begin task" +msgstr "" + +#: app/templates/index.html:41 app/templates/index.html:76 +msgid "Continue task" +msgstr "" + +#: app/templates/index.html:45 app/templates/index.html:80 +msgid "AdminRun" +msgstr "" + +#: app/templates/index.html:46 app/templates/index.html:81 +msgid "Statistics" +msgstr "" + +#: app/templates/index.html:47 app/templates/index.html:82 +msgid "View / Edit" +msgstr "" + +#: app/templates/instructions.html:4 +msgid "Instructions:" +msgstr "" + +#: app/templates/instructions.html:15 +msgid "" +"If you wish to quit a rating task before it is fully completed, you can " +"return to finish the task later but you will need your participant ID-" +"number in order to do that. Please save your participant ID before " +"starting the rating task!" +msgstr "" + +#: app/templates/instructions.html:18 app/templates/quit_task.html:11 +msgid "Your participant ID is:" +msgstr "" + +#: app/templates/instructions.html:21 +msgid "Ready to start" +msgstr "" + +#: app/templates/quit_task.html:8 +msgid "" +"Please write down your participant ID so you can return and finish the " +"rating task later!" +msgstr "" + +#: app/templates/quit_task.html:14 +msgid "Quit!" +msgstr "" + +#: app/templates/register.html:6 +msgid "This is the registration page." +msgstr "" + +#: app/templates/register.html:7 +msgid "Please fill in these background questions before starting the rating task:" +msgstr "" + +#: app/templates/register.html:14 +msgid "Please select" +msgstr "" + +#: app/templates/register.html:22 +msgid "Submit" +msgstr "" + +#: app/templates/task.html:127 +msgid "Quit task" +msgstr "" + +#: app/templates/task.html:128 +msgid "Next page" +msgstr "" + +#: app/templates/task.html:132 +msgid "" +"You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or " +"⌘+/⌘- (Mac)" +msgstr "" + +#: app/templates/task_completed.html:7 +msgid "Task completed!" +msgstr "" + +#: app/templates/task_completed.html:11 +msgid "You have completed the rating task. Thank you for your participation." +msgstr "" + +#: app/templates/test_page.html:7 +msgid "File Not Found" +msgstr "" + +#~ msgid "ID number:" +#~ msgstr "" + +#~ msgid "Language:" +#~ msgstr "" + +#~ msgid "Status:" +#~ msgstr "" + +#~ msgid "Welcome to Onni" +#~ msgstr "" + +#~ msgid "" +#~ "This is the Human Emotion Systems " +#~ "laboratorys stimulus rating tool. If you" +#~ " have previously started a rating " +#~ "task you can continue that task on" +#~ " this page. If you are a " +#~ "researcher you can create new rating " +#~ "tasks by logging in. Or you can" +#~ " start a new rating task and " +#~ "start rating by selecting a task " +#~ "from the database list below." +#~ msgstr "" + +#~ msgid "" +#~ "You can choose the language suitable " +#~ "for you from the language menu in" +#~ " the upper right corner" +#~ msgstr "" + +#~ msgid "List of experiments in database:" +#~ msgstr "" + +#~ msgid "Name:" +#~ msgstr "" + +#~ msgid "Instruction:" +#~ msgstr "" + +#~ msgid "Participation ID is required for this task." +#~ msgstr "" + +#~ msgid "Begin task" +#~ msgstr "" + +#~ msgid "Continue task" +#~ msgstr "" + diff --git a/app/translations/zh/LC_MESSAGES/messages.mo b/app/translations/zh/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..92ea41779f8fe60a11f458613e50c52aa67abfd6 GIT binary patch literal 4609 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 RQNqvsqZj3-vrAqK{sU4<0X6^t literal 0 HcmV?d00001 diff --git a/app/translations/zh/LC_MESSAGES/messages.po b/app/translations/zh/LC_MESSAGES/messages.po new file mode 100644 index 0000000..9e15cd9 --- /dev/null +++ b/app/translations/zh/LC_MESSAGES/messages.po @@ -0,0 +1,270 @@ +# Chinese translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-11-28 14:59+0200\n" +"PO-Revision-Date: 2018-11-27 16:38+0200\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh\n" +"Language-Team: zh <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: app/forms.py:36 +msgid "Continue rating" +msgstr "继ç»è¯„分" + +#: app/forms.py:41 +msgid "Start rating" +msgstr "我准备开始了" + +#: app/routes.py:359 +msgid "ID already in use" +msgstr "" + +#: app/routes.py:368 +msgid "No such ID set for this experiment" +msgstr "" + +#: app/templates/base.html:43 +msgid "Task progress:" +msgstr "" + +#: app/templates/begin_with_id.html:8 +msgid "Please insert your ID-code below:" +msgstr "请输入您的å‚与者ID:" + +#: app/templates/begin_with_id.html:12 app/templates/consent.html:29 +#: app/templates/instructions.html:14 app/templates/quit_task.html:4 +#: app/templates/quit_task.html:7 +msgid "Notice!" +msgstr "注æ„ï¼" + +#: app/templates/begin_with_id.html:13 +msgid "" +"Participation in this experiment requires a login with a predetermined ID" +" code. Please input ID below." +msgstr "" + +#: app/templates/consent.html:11 +msgid "Consent for participation:" +msgstr "" + +#: app/templates/consent.html:14 +msgid "Research bulletin can be read" +msgstr "" + +#: app/templates/consent.html:14 +msgid "here." +msgstr "" + +#: app/templates/consent.html:20 +msgid "Agree" +msgstr "åŒæ„" + +#: app/templates/consent.html:21 +msgid "Disagree" +msgstr "ä¸åŒæ„" + +#: app/templates/consent.html:32 +msgid "" +"In order to participate for the study you need to agree with the terms " +"presented." +msgstr "è¦å‚ä¸Žæœ¬ç ”ç©¶ï¼Œæ‚¨éœ€è¦åŒæ„所æ供的æ¡æ¬¾ã€‚" + +#: app/templates/consent.html:35 +msgid "Close Notice" +msgstr "å…³é—通知" + +#: app/templates/consent.html:36 app/templates/task_completed.html:15 +msgid "Return Home" +msgstr "返回主页" + +#: app/templates/continue_task.html:9 +msgid "Please insert your participant ID:" +msgstr "请输入您的å‚与者ID:" + +#: app/templates/index.html:6 +msgid "Welcome to Onni" +msgstr "欢迎" + +#: app/templates/index.html:9 +msgid "" +"This is the Human Emotion Systems laboratorys stimulus rating tool. If " +"you have previously started a rating task you can continue that task on " +"this page. If you are a researcher you can create new rating tasks by " +"logging in. Or you can start a new rating task and start rating by " +"selecting a task from the database list below." +msgstr "这是人类情感系统实验室刺激评级工具。如果您之å‰å·²ç»å¼€å§‹äº†ä¸€ä¸ªè¯„级工具,您å¯ä»¥åœ¨æ¤é¡µé¢ç»§ç»è¯¥ä»»åŠ¡ã€‚如果您是一åç ”ç©¶å‘˜ï¼Œæ‚¨å¯ä»¥é€šè¿‡ç™»å½•æ¥åˆ›å»ºæ–°çš„评级任务。或者,您å¯ä»¥å¯åŠ¨ä¸€ä¸ªæ–°çš„评级任务,并通过从下é¢çš„æ•°æ®åº“列表ä¸é€‰æ‹©ä¸€ä¸ªè¯„级任务开始评级。" + +#: app/templates/index.html:13 +msgid "" +"You can choose the language suitable for you from the language menu in " +"the upper right corner" +msgstr "" + +#: app/templates/index.html:18 +msgid "List of experiments in database:" +msgstr "æ•°æ®åº“ä¸çš„实验列表:" + +#: app/templates/index.html:25 app/templates/index.html:61 +msgid "Name:" +msgstr "" + +#: app/templates/index.html:26 app/templates/index.html:62 +msgid "Instruction:" +msgstr "" + +#: app/templates/index.html:34 app/templates/index.html:69 +msgid "Participation ID is required for this task." +msgstr "" + +#: app/templates/index.html:40 app/templates/index.html:75 +msgid "Begin task" +msgstr "开始任务" + +#: app/templates/index.html:41 app/templates/index.html:76 +msgid "Continue task" +msgstr "继ç»ä»»åŠ¡" + +#: app/templates/index.html:45 app/templates/index.html:80 +msgid "AdminRun" +msgstr "" + +#: app/templates/index.html:46 app/templates/index.html:81 +msgid "Statistics" +msgstr "" + +#: app/templates/index.html:47 app/templates/index.html:82 +msgid "View / Edit" +msgstr "" + +#: app/templates/instructions.html:4 +msgid "Instructions:" +msgstr "" + +#: app/templates/instructions.html:15 +msgid "" +"If you wish to quit a rating task before it is fully completed, you can " +"return to finish the task later but you will need your participant ID-" +"number in order to do that. Please save your participant ID before " +"starting the rating task!" +msgstr "如果您希望在完æˆè¯„估任务之å‰é€€å‡ºè¯„级任务,您å¯ä»¥è¿”回以åŽå®Œæˆä»»åŠ¡ï¼Œä½†æ˜¯éœ€è¦æ‚¨çš„å‚与者IDå·æ‰èƒ½æ‰§è¡Œæ¤æ“作。 请在开始评级任务å‰ä¿å˜æ‚¨çš„å‚与者IDï¼" + +#: app/templates/instructions.html:18 app/templates/quit_task.html:11 +msgid "Your participant ID is:" +msgstr "您的å‚与者ID是:" + +#: app/templates/instructions.html:21 +msgid "Ready to start" +msgstr "我准备开始了" + +#: app/templates/quit_task.html:8 +msgid "" +"Please write down your participant ID so you can return and finish the " +"rating task later!" +msgstr "请记下您的å‚与者ID,以便ç¨åŽè¿”回并完æˆè¯„级任务ï¼" + +#: app/templates/quit_task.html:14 +msgid "Quit!" +msgstr "退出" + +#: app/templates/register.html:6 +msgid "This is the registration page." +msgstr "这是注册页é¢ã€‚" + +#: app/templates/register.html:7 +msgid "Please fill in these background questions before starting the rating task:" +msgstr "请在开始评分å‰å¡«å†™ä»¥ä¸‹ç›¸å…³çš„问题:" + +#: app/templates/register.html:14 +msgid "Please select" +msgstr "" + +#: app/templates/register.html:22 +msgid "Submit" +msgstr "æ交" + +#: app/templates/task.html:127 +msgid "Quit task" +msgstr "退出任务" + +#: app/templates/task.html:128 +msgid "Next page" +msgstr "下一页" + +#: app/templates/task.html:132 +msgid "" +"You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or " +"⌘+/⌘- (Mac)" +msgstr "" + +#: app/templates/task_completed.html:7 +msgid "Task completed!" +msgstr "任务完æˆäº†ï¼" + +#: app/templates/task_completed.html:11 +msgid "You have completed the rating task. Thank you for your participation." +msgstr "您已完æˆè¯„级任务。 感谢您的å‚与 :)" + +#: app/templates/test_page.html:7 +msgid "File Not Found" +msgstr "" + +#~ msgid "ID number:" +#~ msgstr "" + +#~ msgid "Language:" +#~ msgstr "" + +#~ msgid "Status:" +#~ msgstr "" + +#~ msgid "Welcome to Onni" +#~ msgstr "" + +#~ msgid "" +#~ "This is the Human Emotion Systems " +#~ "laboratorys stimulus rating tool. If you" +#~ " have previously started a rating " +#~ "task you can continue that task on" +#~ " this page. If you are a " +#~ "researcher you can create new rating " +#~ "tasks by logging in. Or you can" +#~ " start a new rating task and " +#~ "start rating by selecting a task " +#~ "from the database list below." +#~ msgstr "" + +#~ msgid "" +#~ "You can choose the language suitable " +#~ "for you from the language menu in" +#~ " the upper right corner" +#~ msgstr "" + +#~ msgid "List of experiments in database:" +#~ msgstr "" + +#~ msgid "Name:" +#~ msgstr "" + +#~ msgid "Instruction:" +#~ msgstr "" + +#~ msgid "Participation ID is required for this task." +#~ msgstr "" + +#~ msgid "Begin task" +#~ msgstr "" + +#~ msgid "Continue task" +#~ msgstr "" + diff --git a/babel.cfg b/babel.cfg index 5ce6e47..c40b2e8 100644 --- a/babel.cfg +++ b/babel.cfg @@ -1,3 +1,3 @@ [python: app/**.py] [jinja2: app/templates/**.html] -extensions=jinja2.ext.autoescape,jinja2.ext.with_ \ No newline at end of file +extensions=jinja2.ext.autoescape,jinja2.ext.with_ diff --git a/config.py b/config.py index ce6f05c..f5a8ed4 100644 --- a/config.py +++ b/config.py @@ -7,21 +7,25 @@ class Config(object): #SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess' + LANGUAGES = ['en', 'fi', 'fa', 'el', 'it', 'zh'] - + """ #SQLITE3 connection settings: SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \ 'sqlite:///' + os.path.join(basedir, 'app.db') SQLALCHEMY_TRACK_MODIFICATIONS = False - + """ #MariaDB mysql database settings - """ - 'mysql+pymysql://'+MYSQL_USER+':'+MYSQL_PASSWORD+'@'+MYSQL_SERVER+'/'+MYSQL_DB+'?charset=utf8mb4' + + + MYSQL_USER = 'rating' + MYSQL_PASSWORD = 'timotimo' + MYSQL_SERVER = 'localhost' + MYSQL_DB = 'rating_tool_db' + + SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://'+MYSQL_USER+':'+MYSQL_PASSWORD+'@'+MYSQL_SERVER+'/'+MYSQL_DB+'?charset=utf8mb4' - MYSQL_USER rating - MYSQL_PASSWORD timotimo - MYSQL_SERVER localhost - MYSQL_DB rating_tool_db - """ \ No newline at end of file + SQLALCHEMY_TRACK_MODIFICATIONS = False + \ No newline at end of file diff --git a/create_rating_db.txt b/create_rating_db.txt new file mode 100644 index 0000000..1eaafe7 --- /dev/null +++ b/create_rating_db.txt @@ -0,0 +1,119 @@ +CREATE TABLE background_question ( + idbackground_question INTEGER NOT NULL AUTO_INCREMENT, + background_question VARCHAR(120), + experiment_idexperiment INTEGER, + PRIMARY KEY (idbackground_question) +); +CREATE TABLE experiment ( + idexperiment INTEGER NOT NULL AUTO_INCREMENT, + name VARCHAR(120), + instruction TEXT, + directoryname VARCHAR(120), + language VARCHAR(120), + status VARCHAR(120), + randomization VARCHAR(120), + short_instruction TEXT, + single_sentence_instruction TEXT, + is_archived VARCHAR(120), + creator_name VARCHAR(120), + research_notification_filename VARCHAR(120), + creation_time DATETIME, + stimulus_size VARCHAR(120), + consent_text TEXT, + use_forced_id VARCHAR(120), + PRIMARY KEY (idexperiment) +); +CREATE TABLE trial_randomization ( + idtrial_randomization INTEGER NOT NULL AUTO_INCREMENT, + page_idpage INTEGER, + randomized_idpage INTEGER, + answer_set_idanswer_set INTEGER, + experiment_idexperiment INTEGER, + PRIMARY KEY (idtrial_randomization) +); +CREATE TABLE user ( + id INTEGER NOT NULL AUTO_INCREMENT, + username VARCHAR(64), + email VARCHAR(120), + password_hash VARCHAR(128), + PRIMARY KEY (id) +); +INSERT INTO user VALUES(1,'Yngwie',NULL,'pbkdf2:sha256:50000$QioS5ICE$17a468394e72aef1243576aa80d29c296c6482ada48be9d25bd7c3b6e8129b40'); +CREATE TABLE answer_set ( + idanswer_set INTEGER NOT NULL AUTO_INCREMENT, + experiment_idexperiment INTEGER, + session VARCHAR(120), + agreement VARCHAR(120), + answer_counter INTEGER, + registration_time DATETIME, + last_answer_time DATETIME, + PRIMARY KEY (idanswer_set), + FOREIGN KEY(experiment_idexperiment) REFERENCES experiment (idexperiment) +); +CREATE TABLE background_question_option ( + idbackground_question_option INTEGER NOT NULL AUTO_INCREMENT, + background_question_idbackground_question INTEGER, + option VARCHAR(120), + PRIMARY KEY (idbackground_question_option), + FOREIGN KEY(background_question_idbackground_question) REFERENCES background_question (idbackground_question) +); +CREATE TABLE forced_id ( + idforced_id INTEGER NOT NULL AUTO_INCREMENT, + experiment_idexperiment INTEGER, + pregenerated_id VARCHAR(120), + PRIMARY KEY (idforced_id), + FOREIGN KEY(experiment_idexperiment) REFERENCES experiment (idexperiment) +); +CREATE TABLE page ( + idpage INTEGER NOT NULL AUTO_INCREMENT, + experiment_idexperiment INTEGER, + type VARCHAR(120), + text VARCHAR(120), + media VARCHAR(120), + PRIMARY KEY (idpage), + FOREIGN KEY(experiment_idexperiment) REFERENCES experiment (idexperiment) +); +CREATE TABLE question ( + idquestion INTEGER NOT NULL AUTO_INCREMENT, + experiment_idexperiment INTEGER, + question VARCHAR(120), + `left` VARCHAR(120), + `right` VARCHAR(120), + PRIMARY KEY (idquestion), + FOREIGN KEY(experiment_idexperiment) REFERENCES experiment (idexperiment) +); +CREATE TABLE answer ( + idanswer INTEGER NOT NULL AUTO_INCREMENT, + question_idquestion INTEGER, + answer_set_idanswer_set INTEGER, + answer VARCHAR(120), + page_idpage INTEGER, + PRIMARY KEY (idanswer), + FOREIGN KEY(answer_set_idanswer_set) REFERENCES answer_set (idanswer_set), + FOREIGN KEY(page_idpage) REFERENCES page (idpage), + FOREIGN KEY(question_idquestion) REFERENCES question (idquestion) +); +CREATE TABLE background_question_answer ( + idbackground_question_answer INTEGER NOT NULL AUTO_INCREMENT, + answer_set_idanswer_set INTEGER, + answer VARCHAR(120), + background_question_idbackground_question INTEGER, + PRIMARY KEY (idbackground_question_answer), + FOREIGN KEY(answer_set_idanswer_set) REFERENCES answer_set (idanswer_set), + FOREIGN KEY(background_question_idbackground_question) REFERENCES background_question (idbackground_question) +); +CREATE INDEX ix_experiment_consent_text ON experiment (consent_text); +CREATE INDEX ix_experiment_creation_time ON experiment (creation_time); +CREATE UNIQUE INDEX ix_experiment_directoryname ON experiment (directoryname); +CREATE INDEX ix_experiment_instruction ON experiment (instruction); +CREATE INDEX ix_experiment_name ON experiment (name); +CREATE INDEX ix_experiment_short_instruction ON experiment (short_instruction); +CREATE INDEX ix_experiment_single_sentence_instruction ON experiment (single_sentence_instruction); +CREATE UNIQUE INDEX ix_user_email ON user (email); +CREATE UNIQUE INDEX ix_user_username ON user (username); +CREATE INDEX ix_answer_set_last_answer_time ON answer_set (last_answer_time); +CREATE INDEX ix_answer_set_registration_time ON answer_set (registration_time); +CREATE INDEX ix_page_media ON page (media); +CREATE INDEX ix_page_text ON page (text); +CREATE INDEX ix_page_type ON page (type); + diff --git a/messages.pot b/messages.pot index f6a2d81..edc5cc7 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-11-04 17:35+0200\n" +"POT-Creation-Date: 2018-11-28 14:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,7 +17,204 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" -#: app/templates/index.html:5 -msgid "Welcome" +#: app/forms.py:36 +msgid "Continue rating" +msgstr "" + +#: app/forms.py:41 +msgid "Start rating" +msgstr "" + +#: app/routes.py:359 +msgid "ID already in use" +msgstr "" + +#: app/routes.py:368 +msgid "No such ID set for this experiment" +msgstr "" + +#: app/templates/base.html:43 +msgid "Task progress:" +msgstr "" + +#: app/templates/begin_with_id.html:8 +msgid "Please insert your ID-code below:" +msgstr "" + +#: app/templates/begin_with_id.html:12 app/templates/consent.html:29 +#: app/templates/instructions.html:14 app/templates/quit_task.html:4 +#: app/templates/quit_task.html:7 +msgid "Notice!" +msgstr "" + +#: app/templates/begin_with_id.html:13 +msgid "" +"Participation in this experiment requires a login with a predetermined ID" +" code. Please input ID below." +msgstr "" + +#: app/templates/consent.html:11 +msgid "Consent for participation:" +msgstr "" + +#: app/templates/consent.html:14 +msgid "Research bulletin can be read" +msgstr "" + +#: app/templates/consent.html:14 +msgid "here." +msgstr "" + +#: app/templates/consent.html:20 +msgid "Agree" +msgstr "" + +#: app/templates/consent.html:21 +msgid "Disagree" +msgstr "" + +#: app/templates/consent.html:32 +msgid "" +"In order to participate for the study you need to agree with the terms " +"presented." +msgstr "" + +#: app/templates/consent.html:35 +msgid "Close Notice" +msgstr "" + +#: app/templates/consent.html:36 app/templates/task_completed.html:15 +msgid "Return Home" +msgstr "" + +#: app/templates/continue_task.html:9 +msgid "Please insert your participant ID:" +msgstr "" + +#: app/templates/index.html:6 +msgid "Welcome to Onni" +msgstr "" + +#: app/templates/index.html:9 +msgid "" +"This is the Human Emotion Systems laboratorys stimulus rating tool. If " +"you have previously started a rating task you can continue that task on " +"this page. If you are a researcher you can create new rating tasks by " +"logging in. Or you can start a new rating task and start rating by " +"selecting a task from the database list below." +msgstr "" + +#: app/templates/index.html:13 +msgid "" +"You can choose the language suitable for you from the language menu in " +"the upper right corner" +msgstr "" + +#: app/templates/index.html:18 +msgid "List of experiments in database:" +msgstr "" + +#: app/templates/index.html:25 app/templates/index.html:61 +msgid "Name:" +msgstr "" + +#: app/templates/index.html:26 app/templates/index.html:62 +msgid "Instruction:" +msgstr "" + +#: app/templates/index.html:34 app/templates/index.html:69 +msgid "Participation ID is required for this task." +msgstr "" + +#: app/templates/index.html:40 app/templates/index.html:75 +msgid "Begin task" +msgstr "" + +#: app/templates/index.html:41 app/templates/index.html:76 +msgid "Continue task" +msgstr "" + +#: app/templates/index.html:45 app/templates/index.html:80 +msgid "AdminRun" +msgstr "" + +#: app/templates/index.html:46 app/templates/index.html:81 +msgid "Statistics" +msgstr "" + +#: app/templates/index.html:47 app/templates/index.html:82 +msgid "View / Edit" +msgstr "" + +#: app/templates/instructions.html:4 +msgid "Instructions:" +msgstr "" + +#: app/templates/instructions.html:15 +msgid "" +"If you wish to quit a rating task before it is fully completed, you can " +"return to finish the task later but you will need your participant ID-" +"number in order to do that. Please save your participant ID before " +"starting the rating task!" +msgstr "" + +#: app/templates/instructions.html:18 app/templates/quit_task.html:11 +msgid "Your participant ID is:" +msgstr "" + +#: app/templates/instructions.html:21 +msgid "Ready to start" +msgstr "" + +#: app/templates/quit_task.html:8 +msgid "" +"Please write down your participant ID so you can return and finish the " +"rating task later!" +msgstr "" + +#: app/templates/quit_task.html:14 +msgid "Quit!" +msgstr "" + +#: app/templates/register.html:6 +msgid "This is the registration page." +msgstr "" + +#: app/templates/register.html:7 +msgid "Please fill in these background questions before starting the rating task:" +msgstr "" + +#: app/templates/register.html:14 +msgid "Please select" +msgstr "" + +#: app/templates/register.html:22 +msgid "Submit" +msgstr "" + +#: app/templates/task.html:127 +msgid "Quit task" +msgstr "" + +#: app/templates/task.html:128 +msgid "Next page" +msgstr "" + +#: app/templates/task.html:132 +msgid "" +"You can zoom in/out the page view by pressing ctrl+/ctrl- (Windows) or " +"⌘+/⌘- (Mac)" +msgstr "" + +#: app/templates/task_completed.html:7 +msgid "Task completed!" +msgstr "" + +#: app/templates/task_completed.html:11 +msgid "You have completed the rating task. Thank you for your participation." +msgstr "" + +#: app/templates/test_page.html:7 +msgid "File Not Found" msgstr "" diff --git a/migrations/versions/75ace1b8b1e0_.py b/migrations/versions/aea4a0f982b4_.py similarity index 73% rename from migrations/versions/75ace1b8b1e0_.py rename to migrations/versions/aea4a0f982b4_.py index d34fc9a..c42c438 100644 --- a/migrations/versions/75ace1b8b1e0_.py +++ b/migrations/versions/aea4a0f982b4_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: 75ace1b8b1e0 +Revision ID: aea4a0f982b4 Revises: -Create Date: 2018-11-04 18:40:37.722652 +Create Date: 2018-11-28 17:07:11.577139 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = '75ace1b8b1e0' +revision = 'aea4a0f982b4' down_revision = None branch_labels = None depends_on = None @@ -27,16 +27,29 @@ def upgrade(): op.create_table('experiment', sa.Column('idexperiment', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=120), nullable=True), - sa.Column('instruction', sa.String(length=120), nullable=True), + sa.Column('instruction', sa.Text(), nullable=True), sa.Column('directoryname', sa.String(length=120), nullable=True), sa.Column('language', sa.String(length=120), nullable=True), sa.Column('status', sa.String(length=120), nullable=True), sa.Column('randomization', sa.String(length=120), nullable=True), + sa.Column('short_instruction', sa.Text(), nullable=True), + sa.Column('single_sentence_instruction', sa.Text(), nullable=True), + sa.Column('is_archived', sa.String(length=120), nullable=True), + sa.Column('creator_name', sa.String(length=120), nullable=True), + sa.Column('research_notification_filename', sa.String(length=120), nullable=True), + sa.Column('creation_time', sa.DateTime(), nullable=True), + sa.Column('stimulus_size', sa.String(length=120), nullable=True), + sa.Column('consent_text', sa.Text(), nullable=True), + sa.Column('use_forced_id', sa.String(length=120), nullable=True), sa.PrimaryKeyConstraint('idexperiment') ) + op.create_index(op.f('ix_experiment_consent_text'), 'experiment', ['consent_text'], unique=False) + op.create_index(op.f('ix_experiment_creation_time'), 'experiment', ['creation_time'], unique=False) op.create_index(op.f('ix_experiment_directoryname'), 'experiment', ['directoryname'], unique=True) op.create_index(op.f('ix_experiment_instruction'), 'experiment', ['instruction'], unique=False) op.create_index(op.f('ix_experiment_name'), 'experiment', ['name'], unique=False) + op.create_index(op.f('ix_experiment_short_instruction'), 'experiment', ['short_instruction'], unique=False) + op.create_index(op.f('ix_experiment_single_sentence_instruction'), 'experiment', ['single_sentence_instruction'], unique=False) op.create_table('trial_randomization', sa.Column('idtrial_randomization', sa.Integer(), nullable=False), sa.Column('page_idpage', sa.Integer(), nullable=True), @@ -60,9 +73,13 @@ def upgrade(): sa.Column('session', sa.String(length=120), nullable=True), sa.Column('agreement', sa.String(length=120), nullable=True), sa.Column('answer_counter', sa.Integer(), nullable=True), + sa.Column('registration_time', sa.DateTime(), nullable=True), + sa.Column('last_answer_time', sa.DateTime(), nullable=True), sa.ForeignKeyConstraint(['experiment_idexperiment'], ['experiment.idexperiment'], ), sa.PrimaryKeyConstraint('idanswer_set') ) + op.create_index(op.f('ix_answer_set_last_answer_time'), 'answer_set', ['last_answer_time'], unique=False) + op.create_index(op.f('ix_answer_set_registration_time'), 'answer_set', ['registration_time'], unique=False) op.create_table('background_question_option', sa.Column('idbackground_question_option', sa.Integer(), nullable=False), sa.Column('background_question_idbackground_question', sa.Integer(), nullable=True), @@ -70,6 +87,13 @@ def upgrade(): sa.ForeignKeyConstraint(['background_question_idbackground_question'], ['background_question.idbackground_question'], ), sa.PrimaryKeyConstraint('idbackground_question_option') ) + op.create_table('forced_id', + sa.Column('idforced_id', sa.Integer(), nullable=False), + sa.Column('experiment_idexperiment', sa.Integer(), nullable=True), + sa.Column('pregenerated_id', sa.String(length=120), nullable=True), + sa.ForeignKeyConstraint(['experiment_idexperiment'], ['experiment.idexperiment'], ), + sa.PrimaryKeyConstraint('idforced_id') + ) op.create_table('page', sa.Column('idpage', sa.Integer(), nullable=False), sa.Column('experiment_idexperiment', sa.Integer(), nullable=True), @@ -123,15 +147,22 @@ def downgrade(): op.drop_index(op.f('ix_page_text'), table_name='page') op.drop_index(op.f('ix_page_media'), table_name='page') op.drop_table('page') + op.drop_table('forced_id') op.drop_table('background_question_option') + op.drop_index(op.f('ix_answer_set_registration_time'), table_name='answer_set') + op.drop_index(op.f('ix_answer_set_last_answer_time'), table_name='answer_set') op.drop_table('answer_set') op.drop_index(op.f('ix_user_username'), table_name='user') op.drop_index(op.f('ix_user_email'), table_name='user') op.drop_table('user') op.drop_table('trial_randomization') + op.drop_index(op.f('ix_experiment_single_sentence_instruction'), table_name='experiment') + op.drop_index(op.f('ix_experiment_short_instruction'), table_name='experiment') op.drop_index(op.f('ix_experiment_name'), table_name='experiment') op.drop_index(op.f('ix_experiment_instruction'), table_name='experiment') op.drop_index(op.f('ix_experiment_directoryname'), table_name='experiment') + op.drop_index(op.f('ix_experiment_creation_time'), table_name='experiment') + op.drop_index(op.f('ix_experiment_consent_text'), table_name='experiment') op.drop_table('experiment') op.drop_table('background_question') # ### end Alembic commands ### -- GitLab