1
1
<html xmlns="http://www.w3.org/1999/xhtml"
2
2
xmlns:py="http://genshi.edgewall.org/">
4
<title>${context.subject.name} (${context.semester.year} semester ${context.semester.semester})</title>
4
<title>${context.subject.name} (${context.semester.year} ${context.semester.display_name})</title>
7
7
<h1>${context.subject.name}</h1>
12
12
href="${req.publisher.generate(context, OfferingEdit)}">
15
<a py:if="req.user.admin"
17
href="${req.publisher.generate(context, OfferingCloneWorksheets)}">
15
20
<a py:if="'enrol' in permissions"
16
21
class="groupaction"
17
href="${req.publisher.generate(context, None, ('+enrolments', '+new'))}">
22
href="${req.publisher.generate(context, EnrolmentsView)}">
35
40
<ul class="paddedlist">
36
<li py:for="project in context.projects"
41
<li py:for="project in context.projects.order_by(Project.deadline)"
37
42
py:attrs="{'class': 'project closed'}
38
43
if project.has_deadline_passed(req.user)
39
44
else {'class': 'project'}"
46
51
<span py:content="format_submission_principal(req.user, principal)" /> –
47
<span title="${format_datetime(project.deadline)}">
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)}">
48
54
${'closed' if project.has_deadline_passed(req.user) else 'due'} ${format_datetime_short(project.deadline)}
50
56
<py:if test="principal is not None"
57
63
<span py:otherwise=""
58
64
py:with="latest = submissions.last()"
59
title="${format_datetime(latest.date_submitted)}">
65
title="Submitted: ${format_datetime(latest.date_submitted)}">
60
66
last submitted ${format_datetime_short(latest.date_submitted)}
67
<a class="verifyaction" href="${latest.get_verify_url(req.user)}">Verify</a>
65
72
${project.synopsis}
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>
68
<py:if test="context.get_open_projects_for_user(req.user).count() > 0">
70
To submit to a project that has not yet closed, use the file
71
browser to navigate to the file or directory that you wish to
72
submit, click “More actions...”,
73
“Submit”, and then select the correct project.
76
If the project to which you intend to submit is not listed,
77
ensure that you are in the correct directory, or a subdirectory
78
thereof. For solo projects, you must be inside the subject's
79
“mywork” directory. For group projects, you must be
80
inside the directory for the assigned group.
83
You may resubmit a project as you wish until the deadline, but
84
a new submission will overwrite any made earlier.
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>
97
<div py:if="'edit' in permissions or context.worksheets.count() > 0"
93
<div py:if="'edit_worksheets' in permissions or len(worksheets) > 0"
98
94
class="majorsection">
99
95
<h2>Worksheets</h2>
100
<py:choose test="context.worksheets.count()">
96
<py:choose test="len(worksheets)">
102
98
There are no worksheets for this offering.
103
99
<a class="addaction" href="${req.publisher.generate(context, None, ('+worksheets', '+new'))}">Create one now</a>
109
105
<!-- Can't generate a URL directly to the worksheet, since this is a fake worksheet. -->
110
106
<a href="${req.publisher.generate(context)}/+worksheets/${worksheet.id}">${worksheet.name}</a>
107
<span py:if="not worksheet.published">(unpublished — not visible to students)</span>
111
108
<py:if test="worksheet.assessable">
113
110
<li class="${worksheet.complete_class}">
124
121
Total exercises completed: ${exercises_done}/${exercises_total} (${exercises_pct}%)
124
<p py:if="context.show_worksheet_marks">
128
125
<span style="font-weight: bold;">Mark:</span> ${worksheet_mark}/${worksheet_max_mark}
131
<a py:if="'edit' in permissions"
133
href="${req.publisher.generate(context, None, ('+worksheets', '+edit'))}">
136
<a py:if="'edit' in permissions"
128
<span py:if="context.worksheet_cutoff is not None"
129
title="${'Closed' if context.has_worksheet_cutoff_passed(req.user) else 'Due'}: ${format_datetime(context.worksheet_cutoff)}">
130
Worksheet submissions ${'closed' if context.has_worksheet_cutoff_passed(req.user) else 'are due'} ${format_datetime_short(context.worksheet_cutoff)}.
132
<py:choose test="context.has_worksheet_cutoff_passed(req.user)">
133
<py:when test="True">You can still submit, but it will not count towards your mark.</py:when>
134
<py:when test="False">After this time, you can still submit, but it will not count towards your mark.</py:when>
137
<div class="horizontalactions" py:if="'edit_worksheets' in permissions">
138
<a class="manageaction" href="${req.publisher.generate(context, None, ('+worksheets', '+edit'))}"> Manage worksheets</a>
139
<a class="manageaction" href="/+exercises">Manage exercises</a>
141
<div class="horizontalactions" py:if="'view_worksheet_marks' in permissions">
142
<a class="marksaction" href="${req.publisher.generate(context, None, ('+worksheets', '+marks'))}">View worksheet marks</a>