./manage.py runserver
28 | ./manage.py migrate
29 | ./manage.py makemigrations
30 |
31 |
32 | ## schema.py
33 |
34 | - Sets up the interaction between the Django models / database and the GraphQL API. For example, this line specifies that we should base our queries off of the Query
class and prevent the conversion of snake_case class names to CamelCase:
35 | schema = graphene.Schema(query=Query, auto_camelcase=False)
36 | - The URL defined to interact with this endpoint is waveform-django/export/urls.py
.
37 |
--------------------------------------------------------------------------------
/waveform-django/cron.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime
2 | import os
3 |
4 | import pandas as pd
5 | import pytz
6 |
7 | from waveforms.models import Annotation
8 | from website.settings import base
9 |
10 |
11 | def update_annotations():
12 | """
13 | Automatically download the annotations to a CSV file as a cron job.
14 |
15 | Parameters
16 | ----------
17 | N/A
18 |
19 | Returns
20 | -------
21 | N/A
22 |
23 | """
24 | # Update the annotation CSV file each night at midnight.
25 | all_anns = Annotation.objects.all()
26 | csv_df = pd.DataFrame.from_dict({
27 | 'username': [a.user.username for a in all_anns],
28 | 'project' : [a.project for a in all_anns],
29 | 'record': [a.record for a in all_anns],
30 | 'event': [a.event for a in all_anns],
31 | 'decision': [a.decision for a in all_anns],
32 | 'comments': [a.comments for a in all_anns],
33 | 'decision_date': [str(a.decision_date) for a in all_anns],
34 | 'is_adjudication': [a.is_adjudication for a in all_anns],
35 | })
36 | file_name = datetime.now(pytz.timezone(base.TIME_ZONE)).strftime('all-anns_%H_%M_%d_%m_%Y.csv')
37 | out_file = os.path.join(base.HEAD_DIR, 'backups', file_name)
38 | csv_df.to_csv(out_file, sep=',', index=False)
39 |
--------------------------------------------------------------------------------
/waveform-django/export/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/export/__init__.py
--------------------------------------------------------------------------------
/waveform-django/export/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class ExportConfig(AppConfig):
5 | name = 'export'
6 |
--------------------------------------------------------------------------------
/waveform-django/export/schema.py:
--------------------------------------------------------------------------------
1 | import graphene
2 | from graphene_django.types import DjangoObjectType
3 | from graphene_django.filter import DjangoFilterConnectionField
4 |
5 | from waveforms.models import User, Annotation, UserSettings
6 |
7 |
8 | # View results at:
9 | # http://localhost:8000/waveform-annotation/graphql?query={all_users{edges{node{username,join_date}}}}
10 | class UserType(DjangoObjectType):
11 | class Meta:
12 | model = User
13 | filter_fields = ['username', 'join_date']
14 | interfaces = (graphene.relay.Node, )
15 |
16 |
17 | # View results at:
18 | # http://localhost:8000/waveform-annotation/graphql?query={all_annotations{edges{node{user{username},project,record,event,decision,comments,decision_date}}}}
19 | class AnnotationType(DjangoObjectType):
20 | class Meta:
21 | model = Annotation
22 | user = graphene.Field(UserType)
23 | filter_fields = ['user', 'project', 'record', 'event', 'decision',
24 | 'comments', 'decision_date']
25 | interfaces = (graphene.relay.Node, )
26 |
27 |
28 | # View results at:
29 | # http://localhost:8000/waveform-annotation/graphql?query={all_user_settings{edges{node{user{username},fig_height,fig_width,margin_left,margin_top,margin_right,margin_bottom,grid_color,sig_color,sig_thickness,ann_color,grid_delta_major,max_y_labels,n_ekg_sigs,down_sample_ekg,down_sample,time_range_min,time_range_max,window_size_min,window_size_max}}}}
30 | class UserSettingsType(DjangoObjectType):
31 | class Meta:
32 | model = UserSettings
33 | user = graphene.Field(UserType)
34 | filter_fields = ['user', 'fig_height', 'fig_width', 'margin_left',
35 | 'margin_top', 'margin_right', 'margin_bottom',
36 | 'grid_color', 'sig_color', 'sig_thickness',
37 | 'ann_color', 'grid_delta_major', 'max_y_labels',
38 | 'n_ekg_sigs', 'down_sample_ekg', 'down_sample',
39 | 'time_range_min', 'time_range_max',
40 | 'window_size_min', 'window_size_max']
41 | interfaces = (graphene.relay.Node, )
42 |
43 |
44 | class Query(graphene.ObjectType):
45 | all_users = DjangoFilterConnectionField(UserType)
46 | all_annotations = DjangoFilterConnectionField(AnnotationType)
47 | all_user_settings = DjangoFilterConnectionField(UserSettingsType)
48 |
--------------------------------------------------------------------------------
/waveform-django/export/tests.py:
--------------------------------------------------------------------------------
1 | from django.test.testcases import TestCase
2 | import graphene
3 | import json
4 | from schema import Query
5 |
6 | from waveforms.models import Annotation
7 |
8 |
9 | class TestGraphQL(TestCase):
10 | """
11 | Test the GraphQL API queries.
12 | """
13 | def test_all_annotations(self):
14 | """
15 | Test querying for annotations and their attributes.
16 |
17 | Parameters
18 | ----------
19 | N/A
20 |
21 | Returns
22 | -------
23 | N/A
24 |
25 | """
26 | schema = graphene.Schema(query=Query, auto_camelcase=False)
27 | query_correct = """
28 | query {
29 | all_annotations {
30 | user
31 | project
32 | record
33 | event
34 | decision
35 | comments
36 | decision_date
37 | }
38 | }
39 | """
40 | query_incorrect = """
41 | query {
42 | all_annotations {
43 | user
44 | project
45 | record
46 | event
47 | decision
48 | comments
49 | }
50 | }
51 | """
52 | correct_output = []
53 | for p in Annotation.objects.all():
54 | correct_output.append({
55 | 'user': p.user,
56 | 'project': p.project,
57 | 'record': p.record,
58 | 'event': p.event,
59 | 'slug': p.slug,
60 | 'decision': p.decision,
61 | 'comments': p.comments,
62 | 'decision_date': p.decision_date,
63 | })
64 | result_correct = schema.execute(query_correct)
65 | self.assertIsNone(result_correct.errors)
66 | result_incorrect = schema.execute(query_incorrect)
67 | self.assertIsNotNone(result_incorrect.errors)
68 | result_correct = json.loads(json.dumps(result_correct.to_dict()))['data']['all_annotations']
69 | matches = [i for i in result_correct if i not in correct_output]
70 | self.assertEqual(matches, [])
71 |
--------------------------------------------------------------------------------
/waveform-django/export/urls.py:
--------------------------------------------------------------------------------
1 | from django.urls import path
2 | from graphene_django.views import GraphQLView
3 | from schema import schema
4 |
5 |
6 | urlpatterns = [
7 | path('graphql', GraphQLView.as_view(graphiql=False, schema=schema),
8 | name='graphql'),
9 | ]
10 |
--------------------------------------------------------------------------------
/waveform-django/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | import os
3 | import sys
4 |
5 | if __name__ == "__main__":
6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "website.settings.base")#sqlite")
7 | try:
8 | from django.core.management import execute_from_command_line
9 | except ImportError:
10 | # The above import may fail for some other reason. Ensure that the
11 | # issue is really that Django is missing to avoid masking other
12 | # exceptions on Python 2.
13 | try:
14 | import django
15 | except ImportError:
16 | raise ImportError(
17 | "Couldn't import Django. Are you sure it's installed and "
18 | "available on your PYTHONPATH environment variable? Did you "
19 | "forget to activate a virtual environment?"
20 | )
21 | raise
22 | execute_from_command_line(sys.argv)
23 |
--------------------------------------------------------------------------------
/waveform-django/schema.py:
--------------------------------------------------------------------------------
1 | import export.schema
2 | import graphene
3 |
4 |
5 | class Query(export.schema.Query, graphene.ObjectType):
6 | # This class will inherit from multiple Queries
7 | # as we begin to add more apps to our project
8 | pass
9 |
10 | schema = graphene.Schema(query=Query, auto_camelcase=False)
11 |
--------------------------------------------------------------------------------
/waveform-django/static/bootstrap/css/dashboard.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Base structure
3 | */
4 |
5 | /* Move down content because we have a fixed navbar that is 3.5rem tall */
6 | body {
7 | padding-top: 3.5rem;
8 | }
9 |
10 | /*
11 | * Typography
12 | */
13 |
14 | h1 {
15 | margin-bottom: 20px;
16 | padding-bottom: 9px;
17 | border-bottom: 1px solid #eee;
18 | }
19 |
20 | /*
21 | * Sidebar
22 | */
23 |
24 | .sidebar {
25 | position: fixed;
26 | top: 51px;
27 | bottom: 0;
28 | left: 0;
29 | z-index: 1000;
30 | padding: 20px;
31 | overflow-x: hidden;
32 | overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
33 | border-right: 1px solid #eee;
34 | }
35 |
36 | /* Sidebar navigation */
37 | .sidebar {
38 | padding-left: 0;
39 | padding-right: 0;
40 | }
41 |
42 | .sidebar .nav {
43 | margin-bottom: 20px;
44 | }
45 |
46 | .sidebar .nav-item {
47 | width: 100%;
48 | }
49 |
50 | .sidebar .nav-item + .nav-item {
51 | margin-left: 0;
52 | }
53 |
54 | .sidebar .nav-link {
55 | border-radius: 0;
56 | }
57 |
58 | /*
59 | * Dashboard
60 | */
61 |
62 | /* Placeholders */
63 | .placeholders {
64 | padding-bottom: 3rem;
65 | }
66 |
67 | .placeholder img {
68 | padding-top: 1.5rem;
69 | padding-bottom: 1.5rem;
70 | }
71 |
--------------------------------------------------------------------------------
/waveform-django/static/bootstrap/js/ie10-viewport-bug-workaround.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * IE10 viewport hack for Surface/desktop Windows 8 bug
3 | * Copyright 2014-2017 The Bootstrap Authors
4 | * Copyright 2014-2017 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
6 | */
7 |
8 | // See the Getting Started docs for more information:
9 | // https://getbootstrap.com/getting-started/#support-ie10-width
10 |
11 | (function () {
12 | 'use strict'
13 |
14 | if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
15 | var msViewportStyle = document.createElement('style')
16 | msViewportStyle.appendChild(
17 | document.createTextNode(
18 | '@-ms-viewport{width:auto!important}'
19 | )
20 | )
21 | document.head.appendChild(msViewportStyle)
22 | }
23 |
24 | }())
25 |
--------------------------------------------------------------------------------
/waveform-django/static/bootstrap/js/offcanvas.js:
--------------------------------------------------------------------------------
1 | $(document).ready(function () {
2 | $('[data-toggle="offcanvas"]').click(function () {
3 | $('.row-offcanvas').toggleClass('active')
4 | });
5 | });
6 |
--------------------------------------------------------------------------------
/waveform-django/static/caliper.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/caliper.mp4
--------------------------------------------------------------------------------
/waveform-django/static/caliper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/caliper.png
--------------------------------------------------------------------------------
/waveform-django/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/favicon.ico
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/HELP-US-OUT.txt:
--------------------------------------------------------------------------------
1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,
2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,
3 | comprehensive icon sets or copy and paste your own.
4 |
5 | Please. Check it out.
6 |
7 | -Dave Gandy
8 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/font-awesome/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/font-awesome/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/font-awesome/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/font-awesome/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/font-awesome/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/animated.less:
--------------------------------------------------------------------------------
1 | // Animated Icons
2 | // --------------------------
3 |
4 | .@{fa-css-prefix}-spin {
5 | -webkit-animation: fa-spin 2s infinite linear;
6 | animation: fa-spin 2s infinite linear;
7 | }
8 |
9 | .@{fa-css-prefix}-pulse {
10 | -webkit-animation: fa-spin 1s infinite steps(8);
11 | animation: fa-spin 1s infinite steps(8);
12 | }
13 |
14 | @-webkit-keyframes fa-spin {
15 | 0% {
16 | -webkit-transform: rotate(0deg);
17 | transform: rotate(0deg);
18 | }
19 | 100% {
20 | -webkit-transform: rotate(359deg);
21 | transform: rotate(359deg);
22 | }
23 | }
24 |
25 | @keyframes fa-spin {
26 | 0% {
27 | -webkit-transform: rotate(0deg);
28 | transform: rotate(0deg);
29 | }
30 | 100% {
31 | -webkit-transform: rotate(359deg);
32 | transform: rotate(359deg);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/bordered-pulled.less:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em @fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .@{fa-css-prefix}-pull-left { float: left; }
11 | .@{fa-css-prefix}-pull-right { float: right; }
12 |
13 | .@{fa-css-prefix} {
14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
16 | }
17 |
18 | /* Deprecated as of 4.4.0 */
19 | .pull-right { float: right; }
20 | .pull-left { float: left; }
21 |
22 | .@{fa-css-prefix} {
23 | &.pull-left { margin-right: .3em; }
24 | &.pull-right { margin-left: .3em; }
25 | }
26 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/core.less:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .@{fa-css-prefix} {
5 | display: inline-block;
6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/fixed-width.less:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .@{fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/font-awesome.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables.less";
7 | @import "mixins.less";
8 | @import "path.less";
9 | @import "core.less";
10 | @import "larger.less";
11 | @import "fixed-width.less";
12 | @import "list.less";
13 | @import "bordered-pulled.less";
14 | @import "animated.less";
15 | @import "rotated-flipped.less";
16 | @import "stacked.less";
17 | @import "icons.less";
18 | @import "screen-reader.less";
19 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/larger.less:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .@{fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .@{fa-css-prefix}-2x { font-size: 2em; }
11 | .@{fa-css-prefix}-3x { font-size: 3em; }
12 | .@{fa-css-prefix}-4x { font-size: 4em; }
13 | .@{fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/list.less:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: @fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .@{fa-css-prefix}-li {
11 | position: absolute;
12 | left: -@fa-li-width;
13 | width: @fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.@{fa-css-prefix}-lg {
17 | left: (-@fa-li-width + (4em / 14));
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/mixins.less:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | .fa-icon() {
5 | display: inline-block;
6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
14 | .fa-icon-rotate(@degrees, @rotation) {
15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
16 | -webkit-transform: rotate(@degrees);
17 | -ms-transform: rotate(@degrees);
18 | transform: rotate(@degrees);
19 | }
20 |
21 | .fa-icon-flip(@horiz, @vert, @rotation) {
22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
23 | -webkit-transform: scale(@horiz, @vert);
24 | -ms-transform: scale(@horiz, @vert);
25 | transform: scale(@horiz, @vert);
26 | }
27 |
28 |
29 | // Only display content to screen readers. A la Bootstrap 4.
30 | //
31 | // See: http://a11yproject.com/posts/how-to-hide-content/
32 |
33 | .sr-only() {
34 | position: absolute;
35 | width: 1px;
36 | height: 1px;
37 | padding: 0;
38 | margin: -1px;
39 | overflow: hidden;
40 | clip: rect(0,0,0,0);
41 | border: 0;
42 | }
43 |
44 | // Use in conjunction with .sr-only to only display content when it's focused.
45 | //
46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
47 | //
48 | // Credit: HTML5 Boilerplate
49 |
50 | .sr-only-focusable() {
51 | &:active,
52 | &:focus {
53 | position: static;
54 | width: auto;
55 | height: auto;
56 | margin: 0;
57 | overflow: visible;
58 | clip: auto;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/path.less:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
13 | font-weight: normal;
14 | font-style: normal;
15 | }
16 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/rotated-flipped.less:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
7 |
8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
10 |
11 | // Hook for IE8-9
12 | // -------------------------
13 |
14 | :root .@{fa-css-prefix}-rotate-90,
15 | :root .@{fa-css-prefix}-rotate-180,
16 | :root .@{fa-css-prefix}-rotate-270,
17 | :root .@{fa-css-prefix}-flip-horizontal,
18 | :root .@{fa-css-prefix}-flip-vertical {
19 | filter: none;
20 | }
21 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/screen-reader.less:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { .sr-only(); }
5 | .sr-only-focusable { .sr-only-focusable(); }
6 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/less/stacked.less:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; }
21 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_animated.scss:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | -webkit-animation: fa-spin 2s infinite linear;
6 | animation: fa-spin 2s infinite linear;
7 | }
8 |
9 | .#{$fa-css-prefix}-pulse {
10 | -webkit-animation: fa-spin 1s infinite steps(8);
11 | animation: fa-spin 1s infinite steps(8);
12 | }
13 |
14 | @-webkit-keyframes fa-spin {
15 | 0% {
16 | -webkit-transform: rotate(0deg);
17 | transform: rotate(0deg);
18 | }
19 | 100% {
20 | -webkit-transform: rotate(359deg);
21 | transform: rotate(359deg);
22 | }
23 | }
24 |
25 | @keyframes fa-spin {
26 | 0% {
27 | -webkit-transform: rotate(0deg);
28 | transform: rotate(0deg);
29 | }
30 | 100% {
31 | -webkit-transform: rotate(359deg);
32 | transform: rotate(359deg);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em $fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .#{$fa-css-prefix}-pull-left { float: left; }
11 | .#{$fa-css-prefix}-pull-right { float: right; }
12 |
13 | .#{$fa-css-prefix} {
14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
16 | }
17 |
18 | /* Deprecated as of 4.4.0 */
19 | .pull-right { float: right; }
20 | .pull-left { float: left; }
21 |
22 | .#{$fa-css-prefix} {
23 | &.pull-left { margin-right: .3em; }
24 | &.pull-right { margin-left: .3em; }
25 | }
26 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix} {
5 | display: inline-block;
6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .#{$fa-css-prefix}-2x { font-size: 2em; }
11 | .#{$fa-css-prefix}-3x { font-size: 3em; }
12 | .#{$fa-css-prefix}-4x { font-size: 4em; }
13 | .#{$fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: $fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .#{$fa-css-prefix}-li {
11 | position: absolute;
12 | left: -$fa-li-width;
13 | width: $fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.#{$fa-css-prefix}-lg {
17 | left: -$fa-li-width + (4em / 14);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | @mixin fa-icon() {
5 | display: inline-block;
6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
14 | @mixin fa-icon-rotate($degrees, $rotation) {
15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
16 | -webkit-transform: rotate($degrees);
17 | -ms-transform: rotate($degrees);
18 | transform: rotate($degrees);
19 | }
20 |
21 | @mixin fa-icon-flip($horiz, $vert, $rotation) {
22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
23 | -webkit-transform: scale($horiz, $vert);
24 | -ms-transform: scale($horiz, $vert);
25 | transform: scale($horiz, $vert);
26 | }
27 |
28 |
29 | // Only display content to screen readers. A la Bootstrap 4.
30 | //
31 | // See: http://a11yproject.com/posts/how-to-hide-content/
32 |
33 | @mixin sr-only {
34 | position: absolute;
35 | width: 1px;
36 | height: 1px;
37 | padding: 0;
38 | margin: -1px;
39 | overflow: hidden;
40 | clip: rect(0,0,0,0);
41 | border: 0;
42 | }
43 |
44 | // Use in conjunction with .sr-only to only display content when it's focused.
45 | //
46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
47 | //
48 | // Credit: HTML5 Boilerplate
49 |
50 | @mixin sr-only-focusable {
51 | &:active,
52 | &:focus {
53 | position: static;
54 | width: auto;
55 | height: auto;
56 | margin: 0;
57 | overflow: visible;
58 | clip: auto;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_path.scss:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
13 | font-weight: normal;
14 | font-style: normal;
15 | }
16 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
7 |
8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
10 |
11 | // Hook for IE8-9
12 | // -------------------------
13 |
14 | :root .#{$fa-css-prefix}-rotate-90,
15 | :root .#{$fa-css-prefix}-rotate-180,
16 | :root .#{$fa-css-prefix}-rotate-270,
17 | :root .#{$fa-css-prefix}-flip-horizontal,
18 | :root .#{$fa-css-prefix}-flip-vertical {
19 | filter: none;
20 | }
21 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { @include sr-only(); }
5 | .sr-only-focusable { @include sr-only-focusable(); }
6 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/_stacked.scss:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; }
21 |
--------------------------------------------------------------------------------
/waveform-django/static/font-awesome/scss/font-awesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables";
7 | @import "mixins";
8 | @import "path";
9 | @import "core";
10 | @import "larger";
11 | @import "fixed-width";
12 | @import "list";
13 | @import "bordered-pulled";
14 | @import "animated";
15 | @import "rotated-flipped";
16 | @import "stacked";
17 | @import "icons";
18 | @import "screen-reader";
19 |
--------------------------------------------------------------------------------
/waveform-django/static/interface.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/interface.mp4
--------------------------------------------------------------------------------
/waveform-django/static/jquery-ui/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright jQuery Foundation and other contributors, https://jquery.org/
2 |
3 | This software consists of voluntary contributions made by many
4 | individuals. For exact contribution history, see the revision history
5 | available at https://github.com/jquery/jquery-ui
6 |
7 | The following license applies to all parts of this software except as
8 | documented below:
9 |
10 | ====
11 |
12 | Permission is hereby granted, free of charge, to any person obtaining
13 | a copy of this software and associated documentation files (the
14 | "Software"), to deal in the Software without restriction, including
15 | without limitation the rights to use, copy, modify, merge, publish,
16 | distribute, sublicense, and/or sell copies of the Software, and to
17 | permit persons to whom the Software is furnished to do so, subject to
18 | the following conditions:
19 |
20 | The above copyright notice and this permission notice shall be
21 | included in all copies or substantial portions of the Software.
22 |
23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 |
31 | ====
32 |
33 | Copyright and related rights for sample code are waived via CC0. Sample
34 | code is defined as all source code contained within the demos directory.
35 |
36 | CC0: http://creativecommons.org/publicdomain/zero/1.0/
37 |
38 | ====
39 |
40 | All files located in the node_modules and external directories are
41 | externally maintained libraries used by this software which have their
42 | own licenses; we recommend you read them, as their terms may differ from
43 | the terms above.
44 |
--------------------------------------------------------------------------------
/waveform-django/static/jquery-ui/images/ui-icons_444444_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/jquery-ui/images/ui-icons_444444_256x240.png
--------------------------------------------------------------------------------
/waveform-django/static/jquery-ui/images/ui-icons_555555_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/jquery-ui/images/ui-icons_555555_256x240.png
--------------------------------------------------------------------------------
/waveform-django/static/jquery-ui/images/ui-icons_777620_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/jquery-ui/images/ui-icons_777620_256x240.png
--------------------------------------------------------------------------------
/waveform-django/static/jquery-ui/images/ui-icons_777777_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/jquery-ui/images/ui-icons_777777_256x240.png
--------------------------------------------------------------------------------
/waveform-django/static/jquery-ui/images/ui-icons_cc0000_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/jquery-ui/images/ui-icons_cc0000_256x240.png
--------------------------------------------------------------------------------
/waveform-django/static/jquery-ui/images/ui-icons_ffffff_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/jquery-ui/images/ui-icons_ffffff_256x240.png
--------------------------------------------------------------------------------
/waveform-django/static/jquery-ui/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jquery-ui",
3 | "title": "jQuery UI",
4 | "description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.",
5 | "version": "1.13.0",
6 | "homepage": "http://jqueryui.com",
7 | "author": {
8 | "name": "jQuery Foundation and other contributors",
9 | "url": "https://github.com/jquery/jquery-ui/blob/1.13.0/AUTHORS.txt"
10 | },
11 | "main": "ui/widget.js",
12 | "maintainers": [
13 | {
14 | "name": "Jörn Zaefferer",
15 | "email": "joern.zaefferer@gmail.com",
16 | "url": "http://bassistance.de"
17 | },
18 | {
19 | "name": "Mike Sherov",
20 | "email": "mike.sherov@gmail.com",
21 | "url": "http://mike.sherov.com"
22 | },
23 | {
24 | "name": "TJ VanToll",
25 | "email": "tj.vantoll@gmail.com",
26 | "url": "http://tjvantoll.com"
27 | },
28 | {
29 | "name": "Felix Nagel",
30 | "email": "info@felixnagel.com",
31 | "url": "http://www.felixnagel.com"
32 | },
33 | {
34 | "name": "Alex Schmitz",
35 | "email": "arschmitz@gmail.com",
36 | "url": "https://github.com/arschmitz"
37 | }
38 | ],
39 | "repository": {
40 | "type": "git",
41 | "url": "git://github.com/jquery/jquery-ui.git"
42 | },
43 | "bugs": "https://bugs.jqueryui.com/",
44 | "license": "MIT",
45 | "scripts": {
46 | "test": "grunt"
47 | },
48 | "dependencies": {
49 | "jquery": ">=1.8.0 <4.0.0"
50 | },
51 | "devDependencies": {
52 | "commitplease": "3.2.0",
53 | "eslint-config-jquery": "3.0.0",
54 | "glob": "7.1.7",
55 | "grunt": "1.4.1",
56 | "grunt-bowercopy": "1.2.5",
57 | "grunt-cli": "1.4.3",
58 | "grunt-compare-size": "0.4.2",
59 | "grunt-contrib-concat": "1.0.1",
60 | "grunt-contrib-csslint": "2.0.0",
61 | "grunt-contrib-qunit": "5.0.1",
62 | "grunt-contrib-requirejs": "1.0.0",
63 | "grunt-contrib-uglify": "5.0.1",
64 | "grunt-eslint": "23.0.0",
65 | "grunt-git-authors": "3.2.0",
66 | "grunt-html": "14.5.0",
67 | "load-grunt-tasks": "5.1.0",
68 | "rimraf": "3.0.2",
69 | "testswarm": "1.1.2"
70 | },
71 | "keywords": []
72 | }
73 |
--------------------------------------------------------------------------------
/waveform-django/static/practice-test.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/practice-test.mp4
--------------------------------------------------------------------------------
/waveform-django/static/self-assignment.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/self-assignment.mp4
--------------------------------------------------------------------------------
/waveform-django/static/tutorial_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MIT-LCP/waveform-annotation/85f199f421ea0475eddc73bdd46fabeb494afd50/waveform-django/static/tutorial_image.png
--------------------------------------------------------------------------------
/waveform-django/templates/base.html:
--------------------------------------------------------------------------------
1 |
2 | {% load static %}
3 |
4 |
5 |
6 |
50 |
51 |
54 |
55 | |
56 | {% endif %}
57 | {% if user.is_adjudicator %}
58 |
59 |
60 |
63 |
68 |
67 | |
69 | {% endif %}
70 |
71 |
72 |
81 |
82 | |
83 |
84 |
85 |
94 |
95 | |
96 | {% url 'leaderboard' as url %}
97 |
98 |
99 |
102 |
103 | |
104 | {% url 'practice_test' as url %}
105 |
106 |
107 |
116 |
117 | |
118 | {% url 'viewer_tutorial' as url %}
119 |
120 |
121 |
124 |
125 | |
126 | {% url 'viewer_settings' as url %}
127 |
128 |
129 |
132 |
133 | |
134 |
---|
36 | {{ cat }} 37 | | 38 | {% endfor %} 39 | 40 |41 | Edit adjudication 42 | | 43 |44 | Delete adjudication 45 | | 46 |
---|---|---|
54 | {{ v }} 55 | | 56 | {% endfor %} 57 | {% else %} 58 | {% for v in val|slice:"2:" %} 59 |60 | {{ v }} 61 | | 62 | {% endfor %} 63 | {% endif %} 64 |
78 | {{ cat }} 79 | | 80 | {% endfor %} 81 |82 | Edit adjudication 83 | | 84 |
---|---|
90 | {{ v }} 91 | | 92 | {% endfor %} 93 |
136 | {{ cat }} 137 | | 138 | {% endfor %} 139 | 140 |141 | Edit adjudication 142 | | 143 |144 | Delete adjudication 145 | | 146 |
---|---|---|
154 | {{ v }} 155 | | 156 | {% endfor %} 157 | {% else %} 158 | {% for v in val|slice:"2:" %} 159 |160 | {{ v }} 161 | | 162 | {% endfor %} 163 | {% endif %} 164 |
204 | {{ cat }} 205 | | 206 | {% endfor %} 207 |208 | Edit adjudication 209 | | 210 |
---|---|
216 | {{ v }} 217 | | 218 | {% endfor %} 219 |
Invite a new user by email address
33 | 59 |Invited users
60 |Last Invite Date | 64 |Joined | 65 |Joined Username | 66 ||
---|---|---|---|
{{ u.email }} | 70 |{{ u.last_invite_date }} | 71 |{{ u.joined }} | 72 |{{ u.joined_username }} | 73 |
Active Assignments
78 |Username | 81 |Events Remaining | 82 |Assignment Start Date | 83 |84 | |
---|---|---|---|
{{ u.username }} | 89 |{{ u.events_remaining }} | 90 |{{ u.date_assigned }} | 91 |92 | 97 | | 98 |
Joined users
105 |Username | 108 |Join Date | 109 |Last Login | 110 |Total Number of Annotations (across all projects) | 111 |New Settings <{field: [default,user set], ...}> | 112 |Adjudicator Control | 113 |Admin Control | 114 |
---|---|---|---|---|---|---|
{{ u.username }} | 118 |{{ u.join_date }} | 119 |{{ u.last_login }} | 120 |{{ u.num_annotations }} | 121 |{{ u.new_settings }} | 122 |
123 | {% if u.is_adjudicator %}
124 |
125 |
129 |
130 | {% else %}
131 |
132 |
136 |
137 | {% endif %}
138 | |
139 |
140 | {% if u.is_admin %}
141 |
142 |
146 |
147 | {% else %}
148 |
149 |
153 |
154 | {% endif %}
155 | |
156 |
183 | {{ cat }} 184 | | 185 | {% endfor %} 186 |
---|
191 | {{ v }} 192 | | 193 | {% endfor %} 194 |
225 | {{ cat }} 226 | | 227 | {% endfor %} 228 |
---|
233 | {{ v }} 234 | | 235 | {% endfor %} 236 |
268 | {{ cat }} 269 | | 270 | {% endfor %} 271 |
---|
276 | {{ v }} 277 | | 278 | {% endfor %} 279 |
23 | {{ project }} {{ event }} Correct answer: {{ responses.0 }} Your answer: {{ responses.1 }} 24 | {% if responses.0 == responses.1 %} ✔️ {% else %} ❌ {% endif %} 25 |
26 | {% endfor %} 27 | {% endfor %} 28 |Score: {{ correct }}/{{ total }}
29 | {% endif %} 30 |14 | Your password has been reset. You may go ahead and sign in now. 15 |
16 |28 | The password reset link was invalid, possibly because it has already been used. 29 | Please request a new password reset. 30 |
31 | {% endcomment %} 32 |33 | Return to login page 34 |
35 |14 | We've emailed you instructions for resetting your password, if an account exists with the username you entered. 15 | You should receive them shortly. 16 |
17 |18 | If you don't receive an email, please make sure you've entered the username you registered with, 19 | and check your email's spam folder. 20 |
21 |22 | Return to login page 23 |
24 |26 | Remember your password? Return to login page 27 |
28 |28 | {{ message }} 29 |
30 | {% endfor %} 31 |