12
12
href="${req.publisher.generate(context, OfferingEdit)}">
15
<a py:if="req.user.admin"
17
href="${req.publisher.generate(context, OfferingCloneWorksheets)}">
20
15
<a py:if="'enrol' in permissions"
21
16
class="groupaction"
22
href="${req.publisher.generate(context, EnrolmentsView)}">
17
href="${req.publisher.generate(context, None, ('+enrolments', '+new'))}">
40
35
<ul class="paddedlist">
41
<li py:for="project in context.projects.order_by(Project.deadline)"
36
<li py:for="project in context.projects"
42
37
py:attrs="{'class': 'project closed'}
43
38
if project.has_deadline_passed(req.user)
44
39
else {'class': 'project'}"
51
46
<span py:content="format_submission_principal(req.user, principal)" /> –
52
47
<!-- 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
<span title="${format_datetime(project.deadline)}">
54
49
${'closed' if project.has_deadline_passed(req.user) else 'due'} ${format_datetime_short(project.deadline)}
56
51
<py:if test="principal is not None"
63
58
<span py:otherwise=""
64
59
py:with="latest = submissions.last()"
65
title="Submitted: ${format_datetime(latest.date_submitted)}">
60
title="${format_datetime(latest.date_submitted)}">
66
61
last submitted ${format_datetime_short(latest.date_submitted)}
67
<a class="verifyaction" href="${latest.get_verify_url(req.user)}">Verify</a>
72
66
${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>
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>
69
<py:if test="context.get_open_projects_for_user(req.user).count() > 0">
71
To submit to a project that has not yet closed, use the file
72
browser to navigate to the file or directory that you wish to
73
submit, click “More actions...”,
74
“Submit”, and then select the correct project.
77
If the project to which you intend to submit is not listed,
78
ensure that you are in the correct directory, or a subdirectory
79
thereof. For solo projects, you must be inside the subject's
80
“mywork” directory. For group projects, you must be
81
inside the directory for the assigned group.
84
You may resubmit a project as you wish until the deadline, but
85
a new submission will overwrite any made earlier.
93
<div py:if="'edit_worksheets' in permissions or len(worksheets) > 0"
98
<div py:if="'edit' in permissions or context.worksheets.count() > 0"
94
99
class="majorsection">
95
100
<h2>Worksheets</h2>
96
<py:choose test="len(worksheets)">
101
<py:choose test="context.worksheets.count()">
98
103
There are no worksheets for this offering.
99
104
<a class="addaction" href="${req.publisher.generate(context, None, ('+worksheets', '+new'))}">Create one now</a>
105
110
<!-- Can't generate a URL directly to the worksheet, since this is a fake worksheet. -->
106
111
<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>
108
112
<py:if test="worksheet.assessable">
110
114
<li class="${worksheet.complete_class}">
121
125
Total exercises completed: ${exercises_done}/${exercises_total} (${exercises_pct}%)
124
<p py:if="context.show_worksheet_marks">
125
129
<span style="font-weight: bold;">Mark:</span> ${worksheet_mark}/${worksheet_max_mark}
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>
132
<a py:if="'edit' in permissions"
134
href="${req.publisher.generate(context, None, ('+worksheets', '+edit'))}">
137
<a py:if="'edit' in permissions"