Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
medal
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
40
Issues
40
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
bwinf
medal
Commits
9996a14e
Commit
9996a14e
authored
Jul 14, 2020
by
Robert Czechowski
1
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Template jwinf: Make contest.hbs a rebased template
parent
9225e515
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
196 additions
and
283 deletions
+196
-283
src/core.rs
src/core.rs
+32
-50
src/webfw_iron.rs
src/webfw_iron.rs
+7
-3
templates/jwinf/contest.hbs
templates/jwinf/contest.hbs
+157
-230
No files found.
src/core.rs
View file @
9996a14e
...
...
@@ -74,6 +74,22 @@ fn fill_user_data(session: &SessionUser, data: &mut json_val::Map<String, serde_
data
.insert
(
"parent"
.to_string
(),
to_json
(
&
"base"
));
}
fn
fill_oauth_data
((
self_url
,
oauth_providers
):
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
),
data
:
&
mut
json_val
::
Map
<
String
,
serde_json
::
Value
>
)
{
let
mut
oauth_links
:
Vec
<
(
String
,
String
,
String
)
>
=
Vec
::
new
();
if
let
Some
(
oauth_providers
)
=
oauth_providers
{
for
oauth_provider
in
oauth_providers
{
oauth_links
.push
((
oauth_provider
.provider_id
.to_owned
(),
oauth_provider
.login_link_text
.to_owned
(),
oauth_provider
.url
.to_owned
()));
}
}
data
.insert
(
"self_url"
.to_string
(),
to_json
(
&
self_url
));
data
.insert
(
"oauth_links"
.to_string
(),
to_json
(
&
oauth_links
));
}
fn
grade_to_string
(
grade
:
i32
)
->
String
{
match
grade
{
0
=>
"Noch kein Schüler"
.to_string
(),
...
...
@@ -90,7 +106,7 @@ fn grade_to_string(grade: i32) -> String {
}
pub
fn
index
<
T
:
MedalConnection
>
(
conn
:
&
T
,
session_token
:
Option
<
String
>
,
(
self_url
,
oauth_providers
)
:
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
))
oauth_infos
:
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
))
->
(
String
,
json_val
::
Map
<
String
,
json_val
::
Value
>
)
{
let
mut
data
=
json_val
::
Map
::
new
();
...
...
@@ -103,17 +119,7 @@ pub fn index<T: MedalConnection>(conn: &T, session_token: Option<String>,
}
}
let
mut
oauth_links
:
Vec
<
(
String
,
String
,
String
)
>
=
Vec
::
new
();
if
let
Some
(
oauth_providers
)
=
oauth_providers
{
for
oauth_provider
in
oauth_providers
{
oauth_links
.push
((
oauth_provider
.provider_id
.to_owned
(),
oauth_provider
.login_link_text
.to_owned
(),
oauth_provider
.url
.to_owned
()));
}
}
data
.insert
(
"self_url"
.to_string
(),
to_json
(
&
self_url
));
data
.insert
(
"oauth_links"
.to_string
(),
to_json
(
&
oauth_links
));
fill_oauth_data
(
oauth_infos
,
&
mut
data
);
data
.insert
(
"parent"
.to_string
(),
to_json
(
&
"base"
));
(
"index"
.to_owned
(),
data
)
...
...
@@ -172,7 +178,7 @@ pub enum ContestVisibility {
}
pub
fn
show_contests
<
T
:
MedalConnection
>
(
conn
:
&
T
,
session_token
:
&
str
,
(
self_url
,
oauth_providers
)
:
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
),
oauth_infos
:
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
),
visibility
:
ContestVisibility
)
->
MedalValue
{
...
...
@@ -185,17 +191,7 @@ pub fn show_contests<T: MedalConnection>(conn: &T, session_token: &str,
data
.insert
(
"can_start"
.to_string
(),
to_json
(
&
true
));
}
let
mut
oauth_links
:
Vec
<
(
String
,
String
,
String
)
>
=
Vec
::
new
();
if
let
Some
(
oauth_providers
)
=
oauth_providers
{
for
oauth_provider
in
oauth_providers
{
oauth_links
.push
((
oauth_provider
.provider_id
.to_owned
(),
oauth_provider
.login_link_text
.to_owned
(),
oauth_provider
.url
.to_owned
()));
}
}
data
.insert
(
"self_url"
.to_string
(),
to_json
(
&
self_url
));
data
.insert
(
"oauth_links"
.to_string
(),
to_json
(
&
oauth_links
));
fill_oauth_data
(
oauth_infos
,
&
mut
data
);
let
now
=
time
::
get_time
();
let
v
:
Vec
<
ContestInfo
>
=
...
...
@@ -280,8 +276,11 @@ fn check_contest_constraints(session: &SessionUser, contest: &Contest) -> Contes
grade_matching
}
}
pub
fn
show_contest
<
T
:
MedalConnection
>
(
conn
:
&
T
,
contest_id
:
i32
,
session_token
:
&
str
,
query_string
:
Option
<
String
>
)
->
MedalValueResult
{
pub
fn
show_contest
<
T
:
MedalConnection
>
(
conn
:
&
T
,
contest_id
:
i32
,
session_token
:
&
str
,
query_string
:
Option
<
String
>
,
oauth_infos
:
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
))
->
MedalValueResult
{
let
session
=
conn
.get_session_or_new
(
&
session_token
);
let
contest
=
conn
.get_contest_by_id_complete
(
contest_id
);
...
...
@@ -295,7 +294,10 @@ pub fn show_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_token
public
:
contest
.public
};
let
mut
data
=
json_val
::
Map
::
new
();
data
.insert
(
"parent"
.to_string
(),
to_json
(
&
"base"
));
data
.insert
(
"empty"
.to_string
(),
to_json
(
&
"empty"
));
data
.insert
(
"contest"
.to_string
(),
to_json
(
&
ci
));
fill_oauth_data
(
oauth_infos
,
&
mut
data
);
let
constraints
=
check_contest_constraints
(
&
session
,
&
contest
);
...
...
@@ -484,7 +486,7 @@ pub fn start_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_toke
}
pub
fn
login
<
T
:
MedalConnection
>
(
conn
:
&
T
,
login_data
:
(
String
,
String
),
(
self_url
,
oauth_providers
)
:
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
))
oauth_infos
:
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
))
->
Result
<
String
,
MedalValue
>
{
let
(
username
,
password
)
=
login_data
;
...
...
@@ -497,17 +499,7 @@ pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String),
data
.insert
(
"username"
.to_string
(),
to_json
(
&
username
));
data
.insert
(
"parent"
.to_string
(),
to_json
(
&
"base"
));
let
mut
oauth_links
:
Vec
<
(
String
,
String
,
String
)
>
=
Vec
::
new
();
if
let
Some
(
oauth_providers
)
=
oauth_providers
{
for
oauth_provider
in
oauth_providers
{
oauth_links
.push
((
oauth_provider
.provider_id
.to_owned
(),
oauth_provider
.login_link_text
.to_owned
(),
oauth_provider
.url
.to_owned
()));
}
}
data
.insert
(
"self_url"
.to_string
(),
to_json
(
&
self_url
));
data
.insert
(
"oauth_links"
.to_string
(),
to_json
(
&
oauth_links
));
fill_oauth_data
(
oauth_infos
,
&
mut
data
);
Err
((
"login"
.to_owned
(),
data
))
}
...
...
@@ -515,7 +507,7 @@ pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String),
}
pub
fn
login_with_code
<
T
:
MedalConnection
>
(
conn
:
&
T
,
code
:
&
str
,
(
self_url
,
oauth_providers
)
:
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
))
conn
:
&
T
,
code
:
&
str
,
oauth_infos
:
(
Option
<
String
>
,
Option
<
Vec
<
OauthProvider
>>
))
->
Result
<
Result
<
String
,
String
>
,
(
String
,
json_val
::
Map
<
String
,
json_val
::
Value
>
)
>
{
match
conn
.login_with_code
(
None
,
&
code
)
{
Ok
(
session_token
)
=>
Ok
(
Ok
(
session_token
)),
...
...
@@ -527,17 +519,7 @@ pub fn login_with_code<T: MedalConnection>(
data
.insert
(
"code"
.to_string
(),
to_json
(
&
code
));
data
.insert
(
"parent"
.to_string
(),
to_json
(
&
"base"
));
let
mut
oauth_links
:
Vec
<
(
String
,
String
,
String
)
>
=
Vec
::
new
();
if
let
Some
(
oauth_providers
)
=
oauth_providers
{
for
oauth_provider
in
oauth_providers
{
oauth_links
.push
((
oauth_provider
.provider_id
.to_owned
(),
oauth_provider
.login_link_text
.to_owned
(),
oauth_provider
.url
.to_owned
()));
}
}
data
.insert
(
"self_url"
.to_string
(),
to_json
(
&
self_url
));
data
.insert
(
"oauth_links"
.to_string
(),
to_json
(
&
oauth_links
));
fill_oauth_data
(
oauth_infos
,
&
mut
data
);
Err
((
"login"
.to_owned
(),
data
))
}
...
...
src/webfw_iron.rs
View file @
9996a14e
...
...
@@ -297,7 +297,7 @@ fn greet_personal<C>(req: &mut Request) -> IronResult<Response>
// hier ggf. Daten aus dem Request holen
let
config
=
req
.get
::
<
Read
<
SharedConfiguration
>>
()
.unwrap
();
let
(
self_url
,
oauth_providers
)
=
(
config
.self_url
.clone
(),
config
.oauth_providers
.clone
());
let
oauth_infos
=
(
config
.self_url
.clone
(),
config
.oauth_providers
.clone
());
let
(
template
,
mut
data
)
=
{
// hier ggf. Daten aus dem Request holen
...
...
@@ -305,7 +305,7 @@ fn greet_personal<C>(req: &mut Request) -> IronResult<Response>
let
conn
=
mutex
.lock
()
.unwrap_or_else
(|
e
|
e
.into_inner
());
// Antwort erstellen und zurücksenden
core
::
index
(
&*
conn
,
session_token
,
(
self_url
,
oauth_providers
)
)
core
::
index
(
&*
conn
,
session_token
,
oauth_infos
)
};
/*if let Some(server_message) = &config.server_message {
...
...
@@ -463,7 +463,11 @@ fn contest<C>(req: &mut Request) -> IronResult<Response>
let
session_token
=
req
.require_session_token
()
?
;
let
query_string
=
req
.url
.query
()
.map
(|
s
|
s
.to_string
());
let
(
template
,
data
)
=
with_conn!
[
core
::
show_contest
,
C
,
req
,
contest_id
,
&
session_token
,
query_string
]
.aug
(
req
)
?
;
let
config
=
req
.get
::
<
Read
<
SharedConfiguration
>>
()
.unwrap
();
let
oauth_infos
=
(
config
.self_url
.clone
(),
config
.oauth_providers
.clone
());
let
(
template
,
data
)
=
with_conn!
[
core
::
show_contest
,
C
,
req
,
contest_id
,
&
session_token
,
query_string
,
oauth_infos
]
.aug
(
req
)
?
;
let
mut
resp
=
Response
::
new
();
resp
.set_mut
(
Template
::
new
(
&
template
,
data
))
.set_mut
(
status
::
Ok
);
...
...
templates/jwinf/contest.hbs
View file @
9996a14e
{{#if
not_bare
}}
<!DOCTYPE html>
<html
lang=
"en"
style=
"background-color: #fafafa;"
>
<head>
<meta
charset=
"utf-8"
>
<meta
name=
"viewport"
content=
"width=450"
>
<title>
Jugendwettbewerb Informatik: Programmieren – leichter, als du denkst!
</title>
<link
rel=
"stylesheet"
href=
"/static/lib/bulma/medal-bulma-0.7.5.css"
>
<link
rel=
"icon"
href=
"/static/images/favicon.png"
type=
"image/png"
>
<style>
ul
{
list-style-type
:
none
;
font-size
:
x-large
;
margin-left
:
20px
;
}
</style>
</head>
<body
style=
"background-color: white;"
>
<div
class=
"container"
style=
"padding: 1.5rem;"
>
<div
class=
"columns"
>
<div
class=
"column is-7"
>
<a
href=
"/"
>
<img
style=
"float:left; margin-right: 10px;"
src=
"/static/images/klein.png"
>
</a>
<h1
class=
"title"
>
Jugendwettbewerb Informatik
</h1>
<h2
class=
"subtitle"
>
Programmieren – leichter, als du denkst!
</h2>
</div>
<div
class=
"column is-one-third"
>
{{#if
logged_in
}}
<div
class=
"columns"
>
<div
class=
"column is-8"
>
Eingeloggt als
<em>
{{
username
}}
</em>
{{#if
firstname
}}{{#if
lastname
}}
(
{{
firstname
}}
{{
lastname
}}
)
{{/if}}{{/if}}
{{#if
teacher
}}
[Lehrer]
{{/if}}
<br>
<a
href=
"/profile"
class=
"button is-info is-small"
>
👤
Profil
</a>
{{#if
teacher
}}
<a
href=
"/group/"
class=
"button is-warning is-small"
>
⚙
Gruppenverwaltung
</a>
{{/if}}
</div>
<div
class=
"column"
><a
href=
"/logout"
class=
"button is-small is-danger"
type=
"submit"
>
⨯
Logout
</a></div>
</div>
<div
class=
"columns"
>
<div
class=
"column"
></div>
</div>
{{/if}}
</div>
</div>
{{#
*
inline
"page"
}}
{{#if
teacher
}}
<!-- <div class="columns alogin">
<div class="column is-8 is-offset-2">
<a href="/group/">
<div class="notification is-warning">
<h3 class="title is-5">Gruppenverwaltung</h3>
<p>Gruppen für die Wettbewerbsteilnahme anlegen und verwalten</p>
</div>
</a>
</div>
</div> -->
<!-- <div class="columns alogin">
<div class="column is-8 is-offset-2">
<a href="/contest/
{{
contest
.
id
}}
/result/">
<div class="notification is-info">
<h3 class="title is-5">Gruppenergebnisse</h3>
<p>Ergebnisse meiner Gruppen für diesen Wettbewerb einsehen</p>
</div>
</a>
{{#if
not_bare
}}
<div
class=
"columns"
>
<div
class=
"column is-8 is-offset-2"
>
<h3
class=
"title is-4"
>
{{#if
has_duration
}}
Wettbewerb:
{{else}}
Trainingsaufgaben:
{{/if}}
{{
contest
.
name
}}
</h3>
{{#if
contest
.
duration
}}
<h4
class=
"subtitle is-5"
>
Dauer:
{{
contest
.
duration
}}
Minuten
</h4>
{{/if}}
</div>
</div>
{{#if
teacher
}}
<div
class=
"columns"
>
<div
class=
"column is-6 is-offset-3"
>
<a
href=
"/contest/
{{
contest
.
id
}}
/result/"
>
<div
class=
"notification is-info"
>
<h3
class=
"title is-5"
>
Gruppenergebnisse
</h3>
<p>
Ergebnisse meiner Gruppen für diesen Wettbewerb einsehen
</p>
</div>
</div> -->
{{/if}}
<div
class=
"columns"
>
<div
class=
"column is-8 is-offset-2"
>
<h3
class=
"title is-4"
>
{{#if
has_duration
}}
Wettbewerb:
{{else}}
Trainingsaufgaben:
{{/if}}
{{
contest
.
name
}}
</h3>
{{#if
contest
.
duration
}}
<h4
class=
"subtitle is-5"
>
Dauer:
{{
contest
.
duration
}}
Minuten
</h4>
{{/if}}
</div>
</div>
{{#if
teacher
}}
<div
class=
"columns"
>
<div
class=
"column is-6 is-offset-3"
>
<a
href=
"/contest/
{{
contest
.
id
}}
/result/"
>
<div
class=
"notification is-info"
>
<h3
class=
"title is-5"
>
Gruppenergebnisse
</h3>
<p>
Ergebnisse meiner Gruppen für diesen Wettbewerb einsehen
</p>
</a>
</div>
</a>
</div>
</div>
</div>
{{/if}}
<div
class=
"columns"
id=
"bare_content"
>
{{/if}}
<div
class=
"columns"
id=
"bare_content"
>
{{/if}}
<div
class=
"column is-6 is-offset-3"
>
<div
style=
"min-height: 400px; margin-bottom:100px;"
class=
"content"
>
<!-- <h3 class="title is-4">
{{#if
has_duration
}}
Wettbewerb:
{{else}}
Trainingsaufgaben:
{{/if}}
{{
contest
.
name
}}
</h3>
{{#if
contest
.
duration
}}
<h4 class="subtitle is-5">Dauer:
{{
contest
.
duration
}}
Minuten</h4>
{{/if}}
-->
{{#if
is_started
}}
<p>
{{#if
has_duration
}}
{{#if
is_time_left
}}
Verbleibenden Zeit:
<span
id=
"timetime"
>
{{
time_left
}}
</span>
<script>
var
seconds_left_at_start
=
{{
seconds_left
}}
;
var
timerStart
=
Date
.
now
();
function
lz
(
a
)
{
var
b
=
a
.
toString
();
if
(
b
.
length
<
2
)
{
return
"
0
"
+
b
;
}
return
b
;
}
function
updateTimer
()
{
var
seconds_passed
=
(
Date
.
now
()
-
timerStart
)
/
1000
;
var
seconds_left
=
seconds_left_at_start
-
seconds_passed
;
var
hour
=
seconds_left
/
3600
|
0
;
var
min
=
(
seconds_left
/
60
|
0
)
%
60
|
0
;
var
sec
=
seconds_left
%
60
|
0
;
text
=
hour
.
toString
()
+
"
:
"
+
lz
(
min
)
+
"
<span id=
\"
ttsec
\"
>:
"
+
lz
(
sec
)
+
"
</span>
"
;
document
.
getElementById
(
"
timetime
"
).
innerHTML
=
text
;
}
setInterval
(
updateTimer
,
300
);
</script>
{{else}}
Die Zeit ist abgelaufen. Du kannst nun die Aufgaben nicht mehr öffnen.
{{/if}}
{{/if}}
</p>
{{#
each
tasks
}}
<div>
{{
name
}}
<ul
style=
"list-style-type: none;margin: 5px 30px 15px;padding: 0;"
>
{{#
each
subtasks
}}
<li>
{{#if
..
/
..
/
is_time_up
}}
<button
class=
"button is-link is-outlined"
disabled
>
{{
linktext
}}
</button>
{{else}}
<a
href=
"/task/
{{
id
}}
"
class=
"button is-link is-outlined"
>
{{
linktext
}}
</a>
{{/if}}
</li>
{{/
each
}}
</ul>
</div>
{{/
each
}}
<hr>
<div
class=
"column is-6 is-offset-3"
>
<div
style=
"min-height: 400px; margin-bottom:100px;"
class=
"content"
>
{{#if
is_started
}}
<p>
{{#if
has_duration
}}
{{#if
is_time_left
}}
Verbleibenden Zeit:
<span
id=
"timetime"
>
{{
time_left
}}
</span>
<script>
var
seconds_left_at_start
=
{{
seconds_left
}}
;
var
timerStart
=
Date
.
now
();
function
lz
(
a
)
{
var
b
=
a
.
toString
();
if
(
b
.
length
<
2
)
{
return
"
0
"
+
b
;
}
return
b
;
}
function
updateTimer
()
{
var
seconds_passed
=
(
Date
.
now
()
-
timerStart
)
/
1000
;
var
seconds_left
=
seconds_left_at_start
-
seconds_passed
;
var
hour
=
seconds_left
/
3600
|
0
;
var
min
=
(
seconds_left
/
60
|
0
)
%
60
|
0
;
var
sec
=
seconds_left
%
60
|
0
;
text
=
hour
.
toString
()
+
"
:
"
+
lz
(
min
)
+
"
<span id=
\"
ttsec
\"
>:
"
+
lz
(
sec
)
+
"
</span>
"
;
document
.
getElementById
(
"
timetime
"
).
innerHTML
=
text
;
}
setInterval
(
updateTimer
,
300
);
</script>
{{else}}
Die Zeit ist abgelaufen. Du kannst nun die Aufgaben nicht mehr öffnen.
{{/if}}
{{/if}}
</p>
{{#
each
tasks
}}
<div>
{{
name
}}
<ul
style=
"list-style-type: none;margin: 5px 30px 15px;padding: 0;"
>
{{#
each
subtasks
}}
<li>
{{#if
..
/
..
/
is_time_up
}}
<button
class=
"button is-link is-outlined"
disabled
>
{{
linktext
}}
</button>
{{else}}
<a
href=
"/task/
{{
id
}}
"
class=
"button is-link is-outlined"
>
{{
linktext
}}
</a>
{{/if}}
</li>
{{/
each
}}
</ul>
</div>
{{/
each
}}
<hr>
<p>
Punktestand:
{{
total_points
}}
★ /
{{
max_total_points
}}
☆
(
{{
relative_points
}}
%)
</p>
{{else}}
{{#if
can_start
}}
<p>
<form
action=
""
method=
"post"
>
<input
type=
"hidden"
name=
"csrf_token"
value=
"
{{
csrf_token
}}
"
>
<input
class=
"button is-warning is-medium"
type=
"submit"
value=
"
{{#if
contest
.
duration
}}
⏱
{{/if}}
Jetzt starten!
{{#if
contest
.
duration
}}
(
{{
contest
.
duration
}}
min)
{{/if}}
"
style=
"font-weight:bold;"
>
</form>
</p>
{{#if
contest
.
duration
}}
<p>
Punktestand:
{{
total_points
}}
★ /
{{
max_total_points
}}
☆
(
{{
relative_points
}}
%)
Der Wettbewerb läuft nach dem Starten für
{{
contest
.
duration
}}
Minuten.
Der Wettbewerb kann nach dem Starten nicht mehr pausiert werden!
</p>
{{/if}}
{{#if
time_until_end
}}
<p>
Der Wettbewerb kann noch gestartet werden:
{{
time_until_end
.
0
}}
Tage,
{{
time_until_end
.
1
}}
Stunden,
{{
time_until_end
.
2
}}
Minuten.
</p>
{{/if}}
{{else}}
<p>
Du kannst diesen Wettbewerb nicht starten.
</p>
{{#if
constraints
.
contest_over
}}
<p>
Der Wettbewerb ist bereits beendet.
</p>
{{else}}
{{#if
can_start
}}
<p>
<form
action=
""
method=
"post"
>
<input
type=
"hidden"
name=
"csrf_token"
value=
"
{{
csrf_token
}}
"
>
<input
class=
"button is-warning is-medium"
type=
"submit"
value=
"
{{#if
contest
.
duration
}}
⏱
{{/if}}
Jetzt starten!
{{#if
contest
.
duration
}}
(
{{
contest
.
duration
}}
min)
{{/if}}
"
style=
"font-weight:bold;"
>
</form>
</p>
{{#if
contest
.
duration
}}
<p>
Der Wettbewerb läuft nach dem Starten für
{{
contest
.
duration
}}
Minuten.
Der Wettbewerb kann nach dem Starten nicht mehr pausiert werden!
</p>
{{/if}}
{{#if
time_until_end
}}
<p>
Der Wettbewerb kann noch gestartet werden:
{{
time_until_end
.
0
}}
Tage,
{{
time_until_end
.
1
}}
Stunden,
{{
time_until_end
.
2
}}
Minuten.
</p>
{{#if
constraints
.
contest_not_begun
}}
<p>
Der Wettbewerb hat noch nicht begonnen.
</p>
{{#if
time_until_start
}}
<p>
Der Wettbewerb wird geöffnet in:
{{
time_until_start
.
0
}}
Tagen,
{{
time_until_start
.
1
}}
Stunden,
{{
time_until_start
.
2
}}
Minuten.
</p>
{{/if}}
{{else}}
<p>
Du kannst diesen Wettbewerb nicht starten.
</p>
{{#if
constraints
.
contest_over
}}
<p>
Der Wettbewerb ist bereits beendet.
</p>
{{#if
logged_in
}}
{{#if
constraints
.
grade_too_low
}}
<p>
Deine angegebene Jahrgangsstufe entspricht nicht den für diesen Wettbewerb vorgesehenen Altersgruppen.
</p>
{{/if}}
{{#if
constraints
.
grade_too_high
}}
<p>
Deine angegebene Jahrgangsstufe entspricht nicht den für diesen Wettbewerb vorgesehenen Altersgruppen.
</p>
{{/if}}
{{else}}
{{#if
constraints
.
contest_not_begun
}}
<p>
Der Wettbewerb hat noch nicht begonnen.
</p>
{{#if
time_until_start
}}
<p>
Der Wettbewerb wird geöffnet in:
{{
time_until_start
.
0
}}
Tagen,
{{
time_until_start
.
1
}}
Stunden,
{{
time_until_start
.
2
}}
Minuten.
</p>
{{/if}}
{{else}}
{{#if
logged_in
}}
{{#if
constraints
.
grade_too_low
}}
<p>
Deine angegebene Jahrgangsstufe entspricht nicht den für diesen Wettbewerb vorgesehenen Altersgruppen.
</p>
{{/if}}
{{#if
constraints
.
grade_too_high
}}
<p>
Deine angegebene Jahrgangsstufe entspricht nicht den für diesen Wettbewerb vorgesehenen Altersgruppen.
</p>
{{/if}}
{{else}}
<p>
Möglicherweise musst du dich zunächst
<a
href=
"/login"
>
einloggen
</a>
.
</p>
{{/if}}
{{/if}}
<p>
Möglicherweise musst du dich zunächst
<a
href=
"/login"
>
einloggen
</a>
.
</p>
{{/if}}
{{/if}}
{{/if}}
</div>
</div>
{{#if
not_bare
}}
{{/if}}
{{/if}}
</div>
</div>
<footer
class=
"footer"
>
<div
class=
"content has-text-centered"
>
<p>
</p>
</div>
</footer>
<script>
// Reload page content as soon as you come back from another task via the back button in order to show the newly achieved stars
function
reload_content
(
event
)
{
var
request
=
new
XMLHttpRequest
();
request
.
open
(
"
GET
"
,
"
?bare&r=
"
+
Math
.
random
().
toString
(
36
).
substr
(
2
));
request
.
setRequestHeader
(
"
X-Requested-With
"
,
"
XMLHttpRequest
"
);
request
.
addEventListener
(
'
load
'
,
function
(
event
)
{
if
(
request
.
status
>=
200
&&
request
.
status
<
300
)
{
document
.
getElementById
(
"
bare_content
"
).
innerHTML
=
request
.
responseText
;
}
else
{
console
.
warn
(
request
.
statusText
,
request
.
responseText
);
}
});
request
.
send
();
}
window
.
onpageshow
=
reload_content
;
</script>
</body>
</html>
{{#if
not_bare
}}
</div>
<script>
// Reload page content as soon as you come back from another task via the back button in order to show the newly achieved stars
function
reload_content
(
event
)
{
var
request
=
new
XMLHttpRequest
();
request
.
open
(
"
GET
"
,
"
?bare&r=
"
+
Math
.
random
().
toString
(
36
).
substr
(
2
));
request
.
setRequestHeader
(
"
X-Requested-With
"
,
"
XMLHttpRequest
"
);
request
.
addEventListener
(
'
load
'
,
function
(
event
)
{
if
(
request
.
status
>=
200
&&
request
.
status
<
300
)
{
document
.
getElementById
(
"
bare_content
"
).
innerHTML
=
request
.
responseText
;
}
else
{
console
.
warn
(
request
.
statusText
,
request
.
responseText
);
}
});
request
.
send
();
}
window
.
onpageshow
=
reload_content
;
</script>
{{/if}}
{{/
inline
}}
{{#if
not_bare
}}
{{~>
(
parent
)
~}}
{{else}}
{{~>
(
empty
)
~}}
{{/if}}
Robert Czechowski
@zgtm
mentioned in commit
96c9c52a
·
Jul 21, 2020
mentioned in commit
96c9c52a
mentioned in commit 96c9c52a87b3682827fa970770ada4a4eb8d8cff
Toggle commit list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment