Skip to content

Commit

Permalink
Merge pull request #4 from MykytaMaliarenko/dev
Browse files Browse the repository at this point in the history
0.3
  • Loading branch information
MykytaMaliarenko authored Aug 7, 2020
2 parents 3a30dcc + 77b1f38 commit 48940a2
Show file tree
Hide file tree
Showing 24 changed files with 710 additions and 45 deletions.
25 changes: 25 additions & 0 deletions config/pagination.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from rest_framework.pagination import PageNumberPagination


class XSResultsSetPagination(PageNumberPagination):
page_size = 5
page_size_query_param = 'page_size'
max_page_size = 20


class SMResultsSetPagination(PageNumberPagination):
page_size = 20
page_size_query_param = 'page_size'
max_page_size = 80


class MDResultsSetPagination(PageNumberPagination):
page_size = 80
page_size_query_param = 'page_size'
max_page_size = 200


class LGResultsSetPagination(PageNumberPagination):
page_size = 200
page_size_query_param = 'page_size'
max_page_size = 500
7 changes: 7 additions & 0 deletions config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"""

import os
import sys

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Expand Down Expand Up @@ -127,6 +128,12 @@
}
}

if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'test_db'
}


# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
Expand Down
36 changes: 36 additions & 0 deletions djangoapps/classes/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by Django 3.0.7 on 2020-07-20 11:44

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
('rooms', '0001_initial'),
('groups', '0001_initial'),
('teachers', '0001_initial'),
('timeslots', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='Class',
fields=[
('id', models.IntegerField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=200)),
('type', models.CharField(max_length=10)),
('day_of_week', models.IntegerField()),
('week_number', models.IntegerField()),
('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='classes', to='groups.Group')),
('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='classes', to='rooms.Room')),
('teacher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='classes', to='teachers.Teacher')),
('time_slot', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='classes', to='timeslots.TimeSlot')),
],
options={
'db_table': 'class',
},
),
]
32 changes: 32 additions & 0 deletions djangoapps/classes/migrations/0002_class_groups_new.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Generated by Django 3.0.7 on 2020-07-20 11:57

from django.db import migrations, models
from djangoapps.classes.models import Class


def transfer_old_group_relation(apps, schema_editor):
class_model: Class = apps.get_model('classes', 'Class')
for university_class in class_model.objects.all():
university_class.groups_new.add(university_class.group)
university_class.save()


class Migration(migrations.Migration):
"""
Change relation between class-group from many-to-one --> many-to-many
"""

dependencies = [
('groups', '0001_initial'),
('classes', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='class',
name='groups_new',
field=models.ManyToManyField(related_name='classes_new', to='groups.Group'),
),

migrations.RunPython(transfer_old_group_relation),
]
23 changes: 23 additions & 0 deletions djangoapps/classes/migrations/0003_class_groups_final.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 3.0.7 on 2020-07-22 09:47

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('groups', '0001_initial'),
('classes', '0002_class_groups_new'),
]

operations = [
migrations.RemoveField(
model_name='class',
name='group',
),
migrations.RenameField(
model_name='class',
old_name='groups_new',
new_name='groups',
),
]
4 changes: 2 additions & 2 deletions djangoapps/classes/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class Class(models.Model):
week_number = models.IntegerField()

room = models.ForeignKey(Room, related_name="classes", on_delete=models.CASCADE)
group = models.ForeignKey(Group, related_name="classes", on_delete=models.CASCADE)
groups = models.ManyToManyField(Group, related_name="classes")
teacher = models.ForeignKey(Teacher, related_name="classes", on_delete=models.CASCADE)
time_slot = models.ForeignKey(TimeSlot, related_name="classes", on_delete=models.CASCADE)

Expand All @@ -26,5 +26,5 @@ def __repr__(self):
short_name = self.name[:10] + "..." if len(self.name) > 10 else self.name

return f"<Class id={self.id} name='{short_name}' class_type='{self.type}' " \
f"room_id={self.room_id} teacher_id={self.teacher_id} group_id={self.group_id} " \
f"room_id={self.room_id} teacher_id={self.teacher_id} " \
f"day_of_week={self.day_of_week} week_number={self.week_number} class_time_id={self.time_slot_id}>"
25 changes: 13 additions & 12 deletions djangoapps/classes/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class ClassSerializer(serializers.ModelSerializer):
""" Serializer to represent the Class model """
teacher = TeacherSerializer()
room = RoomSerializer()
group = GroupSerializer()
groups = GroupSerializer(many=True, read_only=True)

class Meta:
model = Class
Expand All @@ -31,27 +31,28 @@ class Meta:
class ClassWithoutRoomSerializer(serializers.ModelSerializer):
""" Serializer to represent the Class model without Room """
teacher = TeacherSerializer()
group = GroupSerializer()
groups = GroupSerializer(many=True, read_only=True)

class Meta:
model = Class
fields = ("id", "name", "type", "day_of_week", "week_number", "teacher",
"group", "time_slot")
"groups", "time_slot")


class RawClassSerializer(serializers.ModelSerializer):
""" Serializer to represent raw Class model without teacher, room, group """
class ClassWithoutTeacherSerializer(serializers.ModelSerializer):
""" Serializer to represent the Class model without Teacher """
room = RoomSerializer()
groups = GroupSerializer(many=True, read_only=True)

class Meta:
model = Class
fields = ("id", "name", "type", "day_of_week", "week_number", "time_slot")

fields = ("id", "name", "type", "day_of_week", "week_number", "room",
"groups", "time_slot")

class RoomsClassesSerializer(serializers.ModelSerializer):
""" Serializer to represent Room model and classes that take place in it """

classes = RawClassSerializer(many=True)
class RawClassSerializer(serializers.ModelSerializer):
""" Serializer to represent raw Class model without teacher, room, group """

class Meta:
model = Room
fields = ("id", "name", "classes")
model = Class
fields = ("id", "name", "type", "day_of_week", "week_number", "time_slot")
83 changes: 81 additions & 2 deletions djangoapps/classes/tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,82 @@
from django.test import TestCase
import json

# Create your tests here.
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase

from djangoapps.tests_data_setup import generate_classes

from djangoapps.groups.models import Group
from djangoapps.classes.models import Class
from djangoapps.rooms.models import Room
from djangoapps.teachers.models import Teacher


class ClassesTest(APITestCase):

@classmethod
def setUpTestData(cls):
test_group = Group(
id=0,
name='км-92',
)
Group.save(test_group)

test_room = Room(
id=0,
name='0',
university_building=0,
)
Room.save(test_room)

test_teacher = Teacher(
id=0,
name='teacher',
official_name='off teacher',
)
Teacher.save(test_teacher)

classes = generate_classes(1,
groups=[test_group],
rooms=[test_room],
teachers=[test_teacher])
for test_class in classes:
Class.save(test_class)

def test_get_classes_by_group_name(self):
"""
Testing ClassesByGroupList view by name.
"""
url = reverse('classes-by-group', kwargs={'group': 'км-92'})
response = self.client.get(url, format='json')
self.default_classes_assert(response)

def test_get_classes_by_group_id(self):
"""
Testing ClassesByGroupList view by id.
"""
url = reverse('classes-by-group', kwargs={'group': 0})
response = self.client.get(url, format='json')
self.default_classes_assert(response)

def test_get_classes_by_room_id(self):
"""
Testing ClassesByRoom view.
"""
url = reverse('classes-by-room', kwargs={'room': 0})
response = self.client.get(url, format='json')
self.default_classes_assert(response)

def test_get_classes_by_teacher_id(self):
"""
Testing ClassesByTeacher view.
"""
url = reverse('classes-by-teacher', kwargs={'teacher': 0})
response = self.client.get(url, format='json')
self.default_classes_assert(response)

def default_classes_assert(self, resp):
json_response = json.loads(resp.content)
self.assertEqual(resp.status_code, status.HTTP_200_OK)
self.assertEqual(type(json_response), list)
self.assertGreater(len(json_response), 0)
5 changes: 4 additions & 1 deletion djangoapps/classes/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.conf.urls import url, include

from djangoapps.classes.views import ClassViewSet, ClassesByGroupList, \
ClassesByBuildingList, ClassesByRoom
ClassesByBuildingList, ClassesByRoom, ClassesByTeacher

router = routers.DefaultRouter()
router.register(r'classes', ClassViewSet, basename='classes')
Expand All @@ -17,5 +17,8 @@
url(r'^classes/room/(?P<room>\d+)/$',
ClassesByRoom.as_view(), name="classes-by-room"),

url(r'^classes/teacher/(?P<teacher>\d+)/$',
ClassesByTeacher.as_view(), name="classes-by-teacher"),

url(r'', include(router.urls)),
]
35 changes: 21 additions & 14 deletions djangoapps/classes/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
from djangoapps.classes.models import Class
from djangoapps.groups.models import Group
from djangoapps.classes.serializers import ClassSerializer, ClassWithoutGroupSerializer, \
RoomsClassesSerializer, ClassWithoutRoomSerializer
from djangoapps.rooms.models import Room
ClassWithoutRoomSerializer, ClassWithoutTeacherSerializer


class ClassViewSet(ReadOnlyModelViewSet):
Expand Down Expand Up @@ -41,44 +40,52 @@ def get_queryset(self):
raise ParseError

if group_id is not None:
classes = Class.objects.filter(group_id=group_id).prefetch_related('group', 'room', 'teacher')
classes = Class.objects.filter(groups__id=group_id).\
distinct('day_of_week', 'week_number', 'time_slot__id').\
prefetch_related('groups', 'room', 'teacher')
if classes:
return classes
else:
raise NotFound
else:
try:
group: Group = Group.objects.get(name=group_name)
return Class.objects.filter(group_id=group.id)
return Class.objects.filter(groups__id=group.id).\
distinct('day_of_week', 'week_number', 'time_slot__id').\
prefetch_related('groups', 'room', 'teacher')
except ObjectDoesNotExist:
raise NotFound


class ClassesByBuildingList(generics.ListAPIView):
class ClassesByRoom(generics.ListAPIView):
"""
A list of classes by rooms in building.
A list of classes by room.
"""

serializer_class = RoomsClassesSerializer
serializer_class = ClassWithoutRoomSerializer

def get_queryset(self):
try:
building: int = int(self.kwargs["building"])
return Room.objects.filter(university_building=building).prefetch_related("classes")
room_id: int = int(self.kwargs["room"])
return Class.objects.filter(room_id=room_id).\
distinct('day_of_week', 'week_number', 'time_slot__id').\
prefetch_related("teacher", "groups")
except ValueError:
raise ParseError


class ClassesByRoom(generics.ListAPIView):
class ClassesByTeacher(generics.ListAPIView):
"""
A list of classes by room.
A list of classes by teacher.
"""

serializer_class = ClassWithoutRoomSerializer
serializer_class = ClassWithoutTeacherSerializer

def get_queryset(self):
try:
room_id: int = int(self.kwargs["room"])
return Class.objects.filter(room_id=room_id).prefetch_related("teacher", "group")
teacher_id: int = int(self.kwargs["teacher"])
return Class.objects.filter(teacher_id=teacher_id).\
distinct('day_of_week', 'week_number', 'time_slot__id').\
prefetch_related("room", "groups")
except ValueError:
raise ParseError
Loading

0 comments on commit 48940a2

Please sign in to comment.