Skip to content

Commit cd6893f

Browse files
committed
Create ProblemInstance model
1 parent 788fb60 commit cd6893f

File tree

5 files changed

+108
-0
lines changed

5 files changed

+108
-0
lines changed

web/attempts/admin.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class AttemptAdmin(SimpleHistoryAdmin):
99
"user",
1010
"part",
1111
"problem",
12+
"problem_instance",
1213
"solution",
1314
"valid",
1415
"feedback",
@@ -17,6 +18,7 @@ class AttemptAdmin(SimpleHistoryAdmin):
1718
list_display = (
1819
"user",
1920
"problem",
21+
"problem_instance",
2022
"part",
2123
"valid",
2224
)
@@ -37,6 +39,7 @@ class AttemptAdmin(SimpleHistoryAdmin):
3739

3840
readonly_fields = [
3941
"problem",
42+
"problem_instance",
4043
]
4144

4245
def problem(self, obj):
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Generated by Django 4.1.2 on 2023-02-19 11:00
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
dependencies = [
9+
("courses", "0004_probleminstance"),
10+
("attempts", "0003_alter_attempt_part"),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name="attempt",
16+
name="problem_instance",
17+
field=models.ForeignKey(
18+
null=True,
19+
on_delete=django.db.models.deletion.SET_NULL,
20+
related_name="attempts",
21+
to="courses.probleminstance",
22+
),
23+
),
24+
migrations.AddField(
25+
model_name="historicalattempt",
26+
name="problem_instance",
27+
field=models.ForeignKey(
28+
blank=True,
29+
db_constraint=False,
30+
null=True,
31+
on_delete=django.db.models.deletion.DO_NOTHING,
32+
related_name="+",
33+
to="courses.probleminstance",
34+
),
35+
),
36+
]

web/attempts/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ class Attempt(models.Model):
1111
part = models.ForeignKey(
1212
"problems.Part", on_delete=models.CASCADE, related_name="attempts"
1313
)
14+
problem_instance = models.ForeignKey(
15+
"courses.ProblemInstance",
16+
on_delete=models.SET_NULL,
17+
related_name="attempts",
18+
null=True,
19+
)
1420
solution = models.TextField(blank=True)
1521
valid = models.BooleanField(default=False)
1622
feedback = models.TextField(default="[]", validators=[is_json_string_list])
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Generated by Django 4.1.2 on 2023-02-19 11:00
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
import utils.models
6+
7+
8+
class Migration(migrations.Migration):
9+
dependencies = [
10+
("problems", "0005_alter_historicalproblem_visible_and_more"),
11+
("courses", "0003_alter_coursegroup_options"),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name="ProblemInstance",
17+
fields=[
18+
(
19+
"id",
20+
models.AutoField(
21+
auto_created=True,
22+
primary_key=True,
23+
serialize=False,
24+
verbose_name="ID",
25+
),
26+
),
27+
("visible", models.BooleanField(default=False, verbose_name="Visible")),
28+
(
29+
"problem",
30+
models.ForeignKey(
31+
on_delete=django.db.models.deletion.CASCADE,
32+
related_name="instances",
33+
to="problems.problem",
34+
),
35+
),
36+
(
37+
"problem_set",
38+
models.ForeignKey(
39+
on_delete=django.db.models.deletion.CASCADE,
40+
to="courses.problemset",
41+
),
42+
),
43+
],
44+
options={
45+
"order_with_respect_to": "problem_set",
46+
},
47+
bases=(utils.models.OrderWithRespectToMixin, models.Model),
48+
),
49+
]

web/courses/models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,3 +576,17 @@ def copy_to(self, course):
576576
for problem in self.problems.all():
577577
problem.copy_to(new_problem_set)
578578
return new_problem_set
579+
580+
581+
class ProblemInstance(OrderWithRespectToMixin, models.Model):
582+
problem = models.ForeignKey(
583+
"problems.Problem", on_delete=models.CASCADE, related_name="instances"
584+
)
585+
problem_set = models.ForeignKey("courses.ProblemSet", on_delete=models.CASCADE)
586+
visible = models.BooleanField(default=False, verbose_name=_("Visible"))
587+
588+
class Meta:
589+
order_with_respect_to = "problem_set"
590+
591+
def __str__(self):
592+
return self.problem.title

0 commit comments

Comments
 (0)