1
<html xmlns="http://www.w3.org/1999/xhtml"
2
xmlns:py="http://genshi.edgewall.org/">
4
<title>${context.subject.name} (${context.semester.year} semester ${context.semester.semester})</title>
7
<h1>${context.subject.name}</h1>
8
<div id="ivle_padding">
9
<div class="contextactions">
10
<a py:if="'edit' in permissions"
12
href="${req.publisher.generate(context, OfferingEdit)}">
15
<a py:if="'enrol' in permissions"
17
href="${req.publisher.generate(context, None, ('+enrolments', '+new'))}">
22
<div py:if="context.description" style="margin-bottom: 1em;">
23
<div style="margin-bottom: 0.5em;">${context.description}</div>
24
<a py:if="context.url" class="webaction" href="${context.url}">Home page</a>
27
<div py:if="'edit' in permissions or context.projects.count() > 0"
30
<py:choose test="context.projects.count()">
32
There are no projects for this offering.
35
<ul class="paddedlist">
36
<li py:for="project in context.projects"
37
py:attrs="{'class': 'project closed'}
38
if project.has_deadline_passed(req.user)
39
else {'class': 'project'}"
40
py:with="principal = project.project_set.get_submission_principal(req.user)">
41
<py:choose test="project.url not in (None, '')">
42
<a py:when="True" href="${project.url}">${project.name}</a>
43
<span py:otherwise="">${project.name}</span>
46
<span py:content="format_submission_principal(req.user, principal)" /> –
47
<!-- XXX This deadline does not take the student's extensions into account. -->
48
<span title="${'Closed' if project.has_deadline_passed(req.user) else 'Due'}: ${format_datetime(project.deadline)}">
49
${'closed' if project.has_deadline_passed(req.user) else 'due'} ${format_datetime_short(project.deadline)}
51
<py:if test="principal is not None"
52
py:with="submissions = project.get_submissions_for_principal(principal)">
54
<py:choose test="submissions.count()">
59
py:with="latest = submissions.last()"
60
title="Submitted: ${format_datetime(latest.date_submitted)}">
61
last submitted ${format_datetime_short(latest.date_submitted)}
62
<a class="verifyaction" href="${latest.get_verify_url(req.user)}">Verify</a>
68
<py:if test="'view_project_submissions' in permissions">
70
<a class="verifyaction" href="${req.publisher.generate(project)}">View submissions</a>
71
<a py:if="project.project_set.is_group" class="manageaction"
72
href="${req.publisher.generate(project.project_set, GroupsView)}">Manage groups</a>
76
<p py:if="context.get_open_projects_for_user(req.user).count() > 0">
77
<a class="helpaction" href="/+help/Submitting%20a%20project">Help submitting a project</a>
82
<a py:if="'edit' in permissions"
84
href="${req.publisher.generate(context, None, '+projects')}">
89
<div py:if="'edit_worksheets' in permissions or context.worksheets.count() > 0"
92
<py:choose test="context.worksheets.count()">
94
There are no worksheets for this offering.
95
<a class="addaction" href="${req.publisher.generate(context, None, ('+worksheets', '+new'))}">Create one now</a>
98
<ul id="tutorial-toc">
99
<py:for each="worksheet in worksheets">
101
<!-- Can't generate a URL directly to the worksheet, since this is a fake worksheet. -->
102
<a href="${req.publisher.generate(context)}/+worksheets/${worksheet.id}">${worksheet.name}</a>
103
<py:if test="worksheet.assessable">
105
<li class="${worksheet.complete_class}">
106
Completed ${worksheet.mand_done}/${worksheet.total}${worksheet.optional_message}
113
<py:if test="exercises_total > 0">
115
<li class="${worksheets_complete_class}">
116
Total exercises completed: ${exercises_done}/${exercises_total} (${exercises_pct}%)
120
<span style="font-weight: bold;">Mark:</span> ${worksheet_mark}/${worksheet_max_mark}
123
<span py:if="'edit_worksheets' in permissions">
124
<a class="manageaction" href="${req.publisher.generate(context, None, ('+worksheets', '+edit'))}"> Manage worksheets</a>
126
<a class="manageaction" href="/+exercises">Manage exercises</a>