Skip to content

Commit 981f82e

Browse files
reading exercise CRUD
1 parent 31cc7e5 commit 981f82e

18 files changed

+164
-27
lines changed

classroom/filters/__init__.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

classroom/filters/teacher/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from .classroom import ClassroomTeacherFilter
2+
from .exercise import ReadingExerciseTeacherFilter

classroom/filters/teacher/exercise.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from django_filters import rest_framework as filters
2+
3+
from classroom.models import ReadingExercise
4+
5+
6+
class ReadingExerciseTeacherFilter(filters.FilterSet):
7+
class Meta:
8+
model = ReadingExercise
9+
fields = {
10+
'identifier': ['exact', 'icontains'],
11+
'content': ['icontains'],
12+
'classrooms': ['exact'], # TODO: how does this work?
13+
}
14+
15+
@property
16+
def qs(self):
17+
parent = super().qs
18+
teacher = self.request.user
19+
exercises_pks = teacher.reading_exercises_created.all().values_list('pk', flat=True)
20+
qs = parent.filter(pk__in=list(exercises_pks))\
21+
.select_related('creator')
22+
return qs
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 3.2.7 on 2021-10-04 14:45
2+
3+
from django.conf import settings
4+
from django.db import migrations, models
5+
import django.db.models.deletion
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12+
('classroom', '0002_readinganswer_readingexercise_readingquestion'),
13+
]
14+
15+
operations = [
16+
migrations.AddField(
17+
model_name='readingexercise',
18+
name='classrooms',
19+
field=models.ManyToManyField(related_name='reading_exercises', to='classroom.Classroom'),
20+
),
21+
migrations.AddField(
22+
model_name='readingexercise',
23+
name='creator',
24+
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reading_exercises_created', to=settings.AUTH_USER_MODEL),
25+
),
26+
]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 3.2.7 on 2021-10-04 15:01
2+
3+
from django.conf import settings
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
11+
('classroom', '0003_auto_20211004_2145'),
12+
]
13+
14+
operations = [
15+
migrations.AlterUniqueTogether(
16+
name='readingexercise',
17+
unique_together={('creator', 'identifier')},
18+
),
19+
]

classroom/models/classroom.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,6 @@ class Classroom(models.Model):
2424
class Meta:
2525
ordering = ['-create_datetime']
2626
unique_together = ['name', 'teacher']
27+
28+
def __str__(self):
29+
return f'{self.name} - (Teacher: {self.teacher.email})'

classroom/models/reading_exercise.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1+
from django.contrib.auth import get_user_model
12
from django.db import models
23

4+
from .classroom import Classroom
5+
6+
User = get_user_model()
7+
38

49
class ReadingExercise(models.Model):
10+
creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='reading_exercises_created')
511
identifier = models.CharField(max_length=20)
612
content = models.TextField()
13+
classrooms = models.ManyToManyField(Classroom, related_name='reading_exercises')
714

815
class Meta:
916
ordering = ['identifier']
17+
unique_together = ['creator', 'identifier']

classroom/permissions.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ def has_object_permission(self, request, view, classroom):
2222
)
2323

2424

25+
class IsTeacherOwnsExercise(IsTeacher):
26+
message = _('Only teacher who owns this exercise has permission for this.')
27+
28+
def has_object_permission(self, request, view, exercise):
29+
return (
30+
super().has_object_permission(request, view, exercise) and
31+
request.user == exercise.creator
32+
)
33+
34+
2535
class IsStudent(IsAuthenticated):
2636
message = _('Only student has permission for this.')
2737

classroom/serializers/__init__.py

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)