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="req.user.admin"
17
href="${req.publisher.generate(context, OfferingCloneWorksheets)}">
20
<a py:if="'enrol' in permissions"
22
href="${req.publisher.generate(context, EnrolmentsView)}">
27
<div py:if="context.description" style="margin-bottom: 1em;">
28
<div style="margin-bottom: 0.5em;">${context.description}</div>
29
<a py:if="context.url" class="webaction" href="${context.url}">Home page</a>
32
<div py:if="'edit' in permissions or context.projects.count() > 0"
35
<py:choose test="context.projects.count()">
37
There are no projects for this offering.
40
<ul class="paddedlist">
41
<li py:for="project in context.projects"
42
py:attrs="{'class': 'project closed'}
43
if project.has_deadline_passed(req.user)
44
else {'class': 'project'}"
45
py:with="principal = project.project_set.get_submission_principal(req.user)">
46
<py:choose test="project.url not in (None, '')">
47
<a py:when="True" href="${project.url}">${project.name}</a>
48
<span py:otherwise="">${project.name}</span>
51
<span py:content="format_submission_principal(req.user, principal)" /> –
52
<!-- XXX This deadline does not take the student's extensions into account. -->
53
<span title="${'Closed' if project.has_deadline_passed(req.user) else 'Due'}: ${format_datetime(project.deadline)}">
54
${'closed' if project.has_deadline_passed(req.user) else 'due'} ${format_datetime_short(project.deadline)}
56
<py:if test="principal is not None"
57
py:with="submissions = project.get_submissions_for_principal(principal)">
59
<py:choose test="submissions.count()">
64
py:with="latest = submissions.last()"
65
title="Submitted: ${format_datetime(latest.date_submitted)}">
66
last submitted ${format_datetime_short(latest.date_submitted)}
67
<a class="verifyaction" href="${latest.get_verify_url(req.user)}">Verify</a>
73
<div class="horizontalactions" py:if="'view_project_submissions' in permissions">
74
<a class="verifyaction" href="${req.publisher.generate(project)}">View submissions</a>
75
<a py:if="project.project_set.is_group" class="groupaction"
76
href="${req.publisher.generate(project.project_set, GroupsView)}">Manage groups</a>
80
<p py:if="context.get_open_projects_for_user(req.user).count() > 0">
81
<a class="helpaction" href="/+help/Submitting%20a%20project">Help submitting a project</a>
86
<a py:if="'edit' in permissions"
88
href="${req.publisher.generate(context, None, '+projects')}">
93
<div py:if="'edit_worksheets' in permissions or context.worksheets.count() > 0"
96
<py:choose test="context.worksheets.count()">
98
There are no worksheets for this offering.
99
<a class="addaction" href="${req.publisher.generate(context, None, ('+worksheets', '+new'))}">Create one now</a>
101
<div py:otherwise="">
102
<ul id="tutorial-toc">
103
<py:for each="worksheet in worksheets">
105
<!-- Can't generate a URL directly to the worksheet, since this is a fake worksheet. -->
106
<a href="${req.publisher.generate(context)}/+worksheets/${worksheet.id}">${worksheet.name}</a>
107
<py:if test="worksheet.assessable">
109
<li class="${worksheet.complete_class}">
110
Completed ${worksheet.mand_done}/${worksheet.total}${worksheet.optional_message}
117
<py:if test="exercises_total > 0">
119
<li class="${worksheets_complete_class}">
120
Total exercises completed: ${exercises_done}/${exercises_total} (${exercises_pct}%)
124
<span style="font-weight: bold;">Mark:</span> ${worksheet_mark}/${worksheet_max_mark}
127
<div class="horizontalactions" py:if="'edit_worksheets' in permissions">
128
<a class="manageaction" href="${req.publisher.generate(context, None, ('+worksheets', '+edit'))}"> Manage worksheets</a>
129
<a class="manageaction" href="/+exercises">Manage exercises</a>