Skip to content

Commit e2d6166

Browse files
committed
add initial_seed to access changes
Can be used to fix the initial seed for an exam for certain students. fixes #314
1 parent 1840b1a commit e2d6166

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed

numbas_lti/forms.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class Meta:
6767
'require_lockdown_app',
6868
'lockdown_app_password',
6969
'seb_settings',
70+
'initial_seed',
7071
]
7172
widgets = {
7273
'description': forms.TextInput(),
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.0.7 on 2024-12-19 09:19
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('numbas_lti', '0097_userscorereported'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='accesschange',
15+
name='initial_seed',
16+
field=models.CharField(blank=True, default='', max_length=20, verbose_name='Initial seed for the random number generator'),
17+
),
18+
]

numbas_lti/models.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,8 @@ class AccessChange(models.Model):
971971
lockdown_app_password = models.CharField(max_length=30, blank=True, verbose_name=_('Password for the Numbas lockdown app'))
972972
seb_settings = models.ForeignKey(SebSettings, blank=True, null=True, on_delete=models.SET_NULL, related_name='access_changes')
973973

974+
initial_seed = models.CharField(max_length=20, default='', blank=True, verbose_name = _('Initial seed for the random number generator'))
975+
974976
users = models.ManyToManyField(User, blank=True, related_name='access_changes')
975977

976978
objects = AccessChangeManager()
@@ -1172,6 +1174,13 @@ def scorm_cmi(self, include_remarked_elements=True, at_time=None):
11721174
'cmi.success_status': '',
11731175
'cmi.completion_status': self.completion_status,
11741176
}
1177+
1178+
changes = self.resource.access_changes.for_user(self.user)
1179+
1180+
for change in changes:
1181+
if change.initial_seed:
1182+
scorm_cmi['numbas.initial_seed'] = change.initial_seed
1183+
11751184
scorm_cmi = {k: {'value':v,'time':self.start_time.timestamp()} for k,v in scorm_cmi.items()}
11761185

11771186
# TODO only fetch the latest values of elements from the DB, somehow

numbas_lti/templates/numbas_lti/management/access_change/edit.html

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ <h1>{% if create %}{% translate "Create an access change" %}{% else %}{% transla
7676
</p>
7777
</fieldset>
7878

79-
{% if resource.exam.has_duration %}
8079
<fieldset>
81-
<legend>{% translate "Exam duration" %}</legend>
80+
<legend>{% translate "Exam settings" %}</legend>
81+
{% if resource.exam.has_duration %}
8282
<p>
8383
<label for="{{form.extend_duration.id_for_label}}">{{form.extend_duration.label}}</label>
8484
{{form.extend_duration}}
@@ -91,8 +91,16 @@ <h1>{% if create %}{% translate "Create an access change" %}{% else %}{% transla
9191
<p class="help-block">
9292
{% blocktranslate %}Change the length of time the student has to complete an attempt after starting it.{% endblocktranslate %}
9393
</p>
94+
{% endif %}
95+
96+
<p>
97+
{{form.initial_seed.label_tag}}
98+
{{form.initial_seed}}
99+
</p>
100+
<p class="help-block">
101+
{% blocktranslate %}Leave blank to use a different seed for each attempt.{% endblocktranslate %}
102+
</p>
94103
</fieldset>
95-
{% endif %}
96104
<fieldset>
97105
<legend>{% translate "Number of attempts" %}</legend>
98106

0 commit comments

Comments
 (0)