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
<!-- 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)}">
47
<span title="${format_datetime(project.deadline)}">
54
48
${'closed' if project.has_deadline_passed(req.user) else 'due'} ${format_datetime_short(project.deadline)}
56
50
<py:if test="principal is not None"
63
57
<span py:otherwise=""
64
58
py:with="latest = submissions.last()"
65
title="Submitted: ${format_datetime(latest.date_submitted)}">
59
title="${format_datetime(latest.date_submitted)}">
66
60
last submitted ${format_datetime_short(latest.date_submitted)}
67
<a class="verifyaction" href="${latest.get_verify_url(req.user)}">Verify</a>
72
65
${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>
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.
93
<div py:if="'edit_worksheets' in permissions or len(worksheets) > 0"
97
<div py:if="'edit' in permissions or context.worksheets.count() > 0"
94
98
class="majorsection">
95
99
<h2>Worksheets</h2>
96
<py:choose test="len(worksheets)">
100
<py:choose test="context.worksheets.count()">
98
102
There are no worksheets for this offering.
99
103
<a class="addaction" href="${req.publisher.generate(context, None, ('+worksheets', '+new'))}">Create one now</a>
105
109
<!-- Can't generate a URL directly to the worksheet, since this is a fake worksheet. -->
106
110
<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
111
<py:if test="worksheet.assessable">
110
113
<li class="${worksheet.complete_class}">
121
124
Total exercises completed: ${exercises_done}/${exercises_total} (${exercises_pct}%)
124
<p py:if="context.show_worksheet_marks">
125
128
<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>
131
<a py:if="'edit' in permissions"
133
href="${req.publisher.generate(context, None, ('+worksheets', '+edit'))}">
136
<a py:if="'edit' in permissions"