diff --git a/.env b/.env new file mode 100644 index 0000000000000000000000000000000000000000..00b6a4c655da3658ee0413456d2254f8e245a76e --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +CELERY_MAIN_CORES=2 +CELERY_LOW_CORES=2 +FLOWER_BASIC_AUTH=flower:whatever \ No newline at end of file diff --git a/app/escriptorium/static/css/escriptorium.css b/app/escriptorium/static/css/escriptorium.css index 4c759a95fba97e2011fd252cd538ba1b64f19cf9..77c3940d23d7d9c98eda1df721eb07689a060a3f 100644 --- a/app/escriptorium/static/css/escriptorium.css +++ b/app/escriptorium/static/css/escriptorium.css @@ -10,6 +10,19 @@ section { display: none; } + +.errorlist { + color: var(--danger); +} +.error { + color: var(--danger); +} + +#delete-point, +#delete-line { + position: absolute; +} + .invisible { visibility: hidden; } @@ -32,6 +45,7 @@ section { /* } */ /* alerts */ + #alerts-container { width: 400px; position: fixed; @@ -44,11 +58,14 @@ section { display: none; } -#alerts-container .separator, #alerts-container .additional { +#alerts-container .separator, +#alerts-container .additional { display: none; } + /* document form */ + .multi-proc span { line-height: 2rem; } @@ -60,6 +77,7 @@ form.inline-form { .import-counter-container { display: none; } + .import-counter-container.ongoing { display: block; } @@ -67,6 +85,7 @@ form.inline-form { #train-counter { display: none; } + #train-counter.ongoing { display: block; } @@ -173,6 +192,7 @@ form.inline-form { color: var(--secondary); text-align: center; } + .process-part-form .help-text { padding: 0.5rem; } @@ -185,6 +205,7 @@ form.inline-form { float: right; opacity: .5; } + .help.open:hover { opacity: 1; } @@ -200,10 +221,11 @@ form.inline-form { padding: 0; overflow: hidden; background-color: #EEEEEE; - border: 1px solid rgba(0,0,0,.125); + border: 1px solid rgba(0, 0, 0, .125); display: none; /* */ } + #viewer-buttons { position: absolute; top: 0; @@ -211,6 +233,7 @@ form.inline-form { z-index: 5; opacity: 0.3; } + #viewer-buttons:hover { opacity: 1; } @@ -227,6 +250,7 @@ form.inline-form { cursor: pointer; overflow: hidden; } + .box .close { display: none; } @@ -235,10 +259,12 @@ form.inline-form { opacity: 0.2; z-index: 2; } + .line-box { z-index: 3; box-sizing: content-box; } + .line-box:hover { box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px var(--secondary); } @@ -263,28 +289,39 @@ form.inline-form { color: var(--dark); } -.card .ongoing, .blink { +.card .ongoing, +.blink { animation-duration: 1s; animation-name: blink; animation-iteration-count: infinite; animation-direction: alternate; } -@keyframes blink{ - from {opacity: 1;} - to {opacity: 0.2;} + +@keyframes blink { + from { + opacity: 1; + } + to { + opacity: 0.2; + } } + .card .proc.error { color: var(--danger); } + .card .proc.pending { color: var(--secondary); } + .card .proc.canceled { color: var(--warning); } + .card .btn.proc { padding: 0; } + .card .btn.proc:hover { color: var(--info); } @@ -292,24 +329,33 @@ form.inline-form { .card .proc.done { color: var(--success); } + .card .js-compressing { display: none; } -.card .js-compressing.pending, .card .js-compressing.ongoing { + +.card .js-compressing.pending, +.card .js-compressing.ongoing { display: inline; } + .card .js-compressing.done { display: none; } .ui-resizable-s { - bottom: 0; /* mess with outline */ + bottom: 0; + /* mess with outline */ } + .ui-resizable-e { - right: 0; /* mess with outline */ + right: 0; + /* mess with outline */ } + /* transcription interface */ + .nav-btn { font-size: 50px; } @@ -325,16 +371,13 @@ form.inline-form { margin: 0 15px; } + .tools { height: 45px; margin-bottom: 5px; /* overflow: hidden; */ } -#trans-panel .zoom-container { - /* height: 100%; */ -} - i.panel-icon { vertical-align: top; } @@ -347,6 +390,7 @@ i.panel-icon { height: 100%; transform-origin: 0 0; } + .js-zoom-target { box-shadow: 1px 0 4px 1px rgba(0,0,0,0.1); } @@ -355,11 +399,12 @@ i.panel-icon { height: 100px; } -#part-trans, #part-img { +#part-trans, +#part-img { overflow: hidden; width: 100%; height: 100%; - transform-origin:top left; + transform-origin: top left; } .zoom-container { @@ -422,6 +467,7 @@ i.panel-icon { display: block; } + #trans-modal #trans-input, #trans-rule, .compared-line { overflow: visible; margin-top: 1rem; @@ -485,6 +531,7 @@ i.panel-icon { padding: 0; cursor: pointer; } + .trans-box:hover { box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px var(--secondary); } @@ -496,6 +543,7 @@ i.panel-icon { max-height: 100%; width: 100%; } + .trans-box span:empty { width: 100%; height: 100%; diff --git a/app/escriptorium/templates/base.html b/app/escriptorium/templates/base.html index e366a9750e2c9f3b84c22d3767950b6189985dc4..ecafcdf5f4c4f4b9fe5f131dadefbc77f8e8a67b 100644 --- a/app/escriptorium/templates/base.html +++ b/app/escriptorium/templates/base.html @@ -70,10 +70,10 @@ <a class="nav-link {% block nav-doc-list-class %}{% endblock %}" href="{% url 'documents-list' %}">{% trans "My Documents" %}</a> </li> <li class="nav-item dropdown"> - <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> - {% blocktrans with username=user.username %}Hello {{username}}{% endblocktrans %} - </a> - <div class="dropdown-menu" aria-labelledby="navbarDropdown"> + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + {% blocktrans with username=user.username %}Hello {{username}}{% endblocktrans %} + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown"> <a class="dropdown-item" href="{% url 'password_change' %}">{% trans "Change password" %}</a> <a class="dropdown-item" href="#">{% trans "Profile" %}</a> <div class="dropdown-divider"></div> diff --git a/app/escriptorium/templates/registration/login.html b/app/escriptorium/templates/registration/login.html index ba8bbd93773d765b101aefba50fd198a3bdd4a5e..e2c93eb8619223cf4064d5c6c9bffdebc2b797aa 100644 --- a/app/escriptorium/templates/registration/login.html +++ b/app/escriptorium/templates/registration/login.html @@ -1,4 +1,5 @@ {% extends 'base.html' %} +{% load i18n %} {% block menu %} {% endblock %} @@ -9,20 +10,20 @@ <div class="col-md-4 col-md-offset-4"> <div class="login-panel panel panel-default"> <div class="panel-heading"> - <h3 class="panel-title">Please Sign In</h3> + <h3 class="panel-title">{% trans "Please Sign In" %}</h3> </div> <div class="panel-body"> {% if form.errors %} - <p>Your username and password didn't match. Please try again.</p> + <p>{% trans "Your username and password didn't match. Please try again." %}</p> {% endif %} {% if next %} {% if user.is_authenticated %} - <p>Your account doesn't have access to this page. To proceed, - please login with an account that has access.</p> + <p>{% trans "Your account doesn't have access to this page. To proceed, + please login with an account that has access." %}</p> {% else %} - <p>Please login to see this page.</p> + <p>{% trans "Please login to see this page." %}</p> {% endif %} {% endif %} @@ -41,7 +42,7 @@ </form> {# Assumes you setup the password_reset view in your URLconf #} - <p><a href="{% url 'password_reset' %}">Lost password?</a></p> + <p><a href="{% url 'password_reset' %}">{% trans "Lost password?" %}</a></p> </div> </div> </div> diff --git a/app/escriptorium/templates/registration/password_change_done.html b/app/escriptorium/templates/registration/password_change_done.html new file mode 100644 index 0000000000000000000000000000000000000000..365e1d12327f9ea10d7817ff83033e77cdf90694 --- /dev/null +++ b/app/escriptorium/templates/registration/password_change_done.html @@ -0,0 +1,19 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block menu %} +{% endblock %} + +{% block body %} +<div class="container"> + <div class="row"> + <div class="col-md-4 col-md-offset-4"> + <div class="login-panel panel panel-default"> + <div class="panel-body"> + <p>{% trans "Your password has successfully been changed." %} + </div> + </div> + </div> + </div> +</div> +{% endblock %} diff --git a/app/escriptorium/templates/registration/password_change_form.html b/app/escriptorium/templates/registration/password_change_form.html new file mode 100644 index 0000000000000000000000000000000000000000..9a03c63c265889e3432da62e022644971caeb7c5 --- /dev/null +++ b/app/escriptorium/templates/registration/password_change_form.html @@ -0,0 +1,71 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block menu %} +{% endblock %} + +{% block body %} +<div class="container"> + <div class="row"> + <div class="col-md-8 col-md-offset-8"> + <div class="login-panel panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">{% trans "Change your password" %}</h3> + </div> + <div class="panel-body"> + + <form method="post"> + {% csrf_token %} + + {% if form.errors %} + <p class="error"> + {% blocktrans count count=form.errors.items|length %} + Please correct the error below. + {% plural %} + Please correct the errors below. + {% endblocktrans %} + </p> + {% endif %} + + <p>{% trans "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." %}</p> + <div>{{ form.new_password1.help_text|safe }}</div> + + <fieldset> + <div class="form-group"> + {{ form.old_password.errors }} + <label for="id_old_password">{% trans "Old password:" %}</label> + <input class="form-control" type="password" name="old_password" autofocus required id="id_old_password"> + </div> + + <div class="form-group"> + {{ form.new_password1.errors }} + <label for="id_new_password1">{% trans "New password:" %}</label> + <input class="form-control" type="password" name="new_password1" required id="id_new_password1"> + </div> + + <div class="form-group"> + {{ form.new_password2.errors }} + <label for="id_new_password2">{% trans "New password confirmation:" %}</label> + <input class="form-control" type="password" name="new_password2" required id="id_new_password2"> + </div> + </fieldset> + + <div class="submit-row"> + <input class="btn btn-success btn-block" type="submit" value="{% trans 'Change my password' %}" class="default"> + </div> + + </div> + </form> + + <p><a href="{% url 'password_reset' %}">{% trans "Lost your password?" %}</a></p> + </div> + </div> + </div> + </div> +</div> + + + + + +{% endblock %} diff --git a/app/escriptorium/templates/registration/password_reset_complete.html b/app/escriptorium/templates/registration/password_reset_complete.html new file mode 100644 index 0000000000000000000000000000000000000000..a4a6bfd7b3458d32312114927470a0313d98baaf --- /dev/null +++ b/app/escriptorium/templates/registration/password_reset_complete.html @@ -0,0 +1,19 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block menu %} +{% endblock %} + +{% block body %} +<div class="container"> + <div class="row"> + <div class="col-md-4 col-md-offset-4"> + <div class="login-panel panel panel-default"> + <div class="panel-body"> + <p>{% trans "Your password has been set. You may go ahead and " %} <a href="{{ login_url }}">{% trans 'log in' %}</a>.</p> + </div> + </div> + </div> + </div> +</div> +{% endblock %} \ No newline at end of file diff --git a/app/escriptorium/templates/registration/password_reset_confirm.html b/app/escriptorium/templates/registration/password_reset_confirm.html new file mode 100644 index 0000000000000000000000000000000000000000..cafbce92e8fce9fa64f5b77c0489dc6ff830c61d --- /dev/null +++ b/app/escriptorium/templates/registration/password_reset_confirm.html @@ -0,0 +1,52 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block menu %} +{% endblock %} + +{% block body %} +<div class="container"> + <div class="row"> + <div class="col-md-4 col-md-offset-4"> + <div class="login-panel panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">{% trans "Reset your password" %}</h3> + </div> + <div class="panel-body"> + + {% if validlink %} + + <p>{% trans "Please enter your new password twice so we can verify you typed it in correctly." %}</p> + + <form method="post"> + {% csrf_token %} + <fieldset> + <div class="form-group field-password1"> + {{ form.new_password1.errors }} + <label for="id_new_password1">{% trans 'New password:' %}</label> + <input class="form-control" type="password" name="new_password1" required="" id="id_new_password1"> + </div> + <div class="form-group field-password2"> + {{ form.new_password2.errors }} + <label for="id_new_password2">{% trans 'Confirm password:' %}</label> + <input class="form-control" type="password" name="new_password2" required="" id="id_new_password2"> + </div> + <input class="btn btn-success btn-block" type="submit" value="{% trans 'Change my password' %}"> + </fieldset> + </form> + + {% else %} + <p>{% trans "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}</p> + {% endif %} + + </div> + </div> + </div> + </div> +</div> +{% endblock %} + + + + + diff --git a/app/escriptorium/templates/registration/password_reset_done.html b/app/escriptorium/templates/registration/password_reset_done.html new file mode 100644 index 0000000000000000000000000000000000000000..97b8a45ace3bb09dfa1d49e0d82f928b06a9f263 --- /dev/null +++ b/app/escriptorium/templates/registration/password_reset_done.html @@ -0,0 +1,20 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block menu %} +{% endblock %} + +{% block body %} +<div class="container"> + <div class="row"> + <div class="col-md-8 col-md-offset-4"> + <div class="login-panel panel panel-default"> + <div class="panel-body"> + <p>{% trans 'We’ve emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly.' %}</p> + <p>{% trans 'If you don’t receive an email, please make sure you’ve entered the address you registered with, and check your spam folder.' %}</p> + </div> + </div> + </div> + </div> +</div> +{% endblock %} \ No newline at end of file diff --git a/app/escriptorium/templates/registration/password_reset_form.html b/app/escriptorium/templates/registration/password_reset_form.html new file mode 100644 index 0000000000000000000000000000000000000000..99e43f9bb9a0e7549a2c38ac9a5ef02e67efaeaa --- /dev/null +++ b/app/escriptorium/templates/registration/password_reset_form.html @@ -0,0 +1,37 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block menu %} +{% endblock %} + +{% block body %} +<div class="container"> + <div class="row"> + <div class="col-md-8 col-md-offset-4"> + <div class="login-panel panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">{% trans "Change your password" %}</h3> + </div> + <div class="panel-body"> + + <p>{% trans 'Forgotten your password? Enter your email address below, and we’ll email instructions for setting a new one.' %}</p> + + <div class="col-md-6"> + <form method="post"> + {% csrf_token %} + <fieldset class="module aligned"> + <div class="form-group"> + {{ form.email.errors }} + <label for="id_email">{% trans 'Email address:' %}</label> + <input class="form-control" type="email" name="email" maxlength="254" required="" id="id_email"> + </div> + <input class="btn btn-success btn-block" type="submit" value="{% trans 'Reset my password' %}"> + </fieldset> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +{% endblock %}