Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 8e79ef7

Browse files
authored
Merge pull request #25 from SELab-2/models-implementation
Groups implemented
2 parents 03f4dde + 97a4f9e commit 8e79ef7

File tree

12 files changed

+164
-46
lines changed

12 files changed

+164
-46
lines changed

backend/pigeonhole/apps/courses/migrations/0001_initial.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
# Generated by Django 5.0.2 on 2024-03-02 13:17
1+
# Generated by Django 5.0.2 on 2024-03-02 21:03
22

33
from django.db import migrations, models
44

55

66
class Migration(migrations.Migration):
7-
87
initial = True
98

109
dependencies = [

backend/pigeonhole/apps/courses/models.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33

44

55
# Create your models here.
6-
76
class Course(models.Model):
87
course_id = models.BigAutoField(primary_key=True)
98
name = models.CharField(max_length=256)
109
description = models.TextField()
1110

11+
objects = models.Manager()
12+
1213

1314
class CourseSerializer(serializers.ModelSerializer):
1415
class Meta:

backend/pigeonhole/apps/groups/migrations/0001_initial.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
# Generated by Django 5.0.2 on 2024-03-02 13:17
1+
# Generated by Django 5.0.2 on 2024-03-02 21:03
22

33
import django.db.models.deletion
44
from django.db import migrations, models
55

66

77
class Migration(migrations.Migration):
8-
98
initial = True
109

1110
dependencies = [
@@ -18,6 +17,7 @@ class Migration(migrations.Migration):
1817
fields=[
1918
('group_id', models.BigAutoField(primary_key=True, serialize=False)),
2019
('group_nr', models.IntegerField()),
20+
('feedback', models.TextField(null=True)),
2121
('final_score', models.IntegerField()),
2222
('project_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.project')),
2323
],
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 5.0.2 on 2024-03-02 21:03
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
initial = True
8+
9+
dependencies = [
10+
('groups', '0001_initial'),
11+
('users', '0001_initial'),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name='group',
17+
name='student',
18+
field=models.ManyToManyField(to='users.student'),
19+
),
20+
]

backend/pigeonhole/apps/groups/models.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,21 @@
22
from rest_framework import serializers
33

44
from backend.pigeonhole.apps.projects.models import Project
5+
from backend.pigeonhole.apps.users.models import Student
56

67

78
class Group(models.Model):
89
group_id = models.BigAutoField(primary_key=True)
910
group_nr = models.IntegerField()
10-
final_score = models.IntegerField()
1111
project_id = models.ForeignKey(Project, on_delete=models.CASCADE)
12+
student = models.ManyToManyField(Student)
13+
feedback = models.TextField(null=True)
14+
final_score = models.IntegerField()
15+
16+
objects = models.Manager()
1217

1318

1419
class GroupSerializer(serializers.ModelSerializer):
1520
class Meta:
1621
model = Group
17-
fields = ["group_id", "group_nr", "final_score", "project_id"]
22+
fields = ["group_id", "group_nr", "final_score", "project_id", "student"]

backend/pigeonhole/apps/projects/migrations/0001_initial.py

+29-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
# Generated by Django 5.0.2 on 2024-03-02 13:17
1+
# Generated by Django 5.0.2 on 2024-03-02 21:03
22

33
import django.db.models.deletion
44
from django.db import migrations, models
55

66

77
class Migration(migrations.Migration):
8-
98
initial = True
109

1110
dependencies = [
@@ -19,9 +18,36 @@ class Migration(migrations.Migration):
1918
('project_id', models.BigAutoField(primary_key=True, serialize=False)),
2019
('name', models.CharField(max_length=256)),
2120
('description', models.TextField()),
22-
('deadline', models.DateTimeField()),
2321
('visible', models.BooleanField(default=False)),
2422
('course_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.course')),
2523
],
2624
),
25+
migrations.CreateModel(
26+
name='ForbiddenExtension',
27+
fields=[
28+
('extension_id', models.BigAutoField(primary_key=True, serialize=False)),
29+
('extension', models.IntegerField()),
30+
('project_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.project')),
31+
],
32+
),
33+
migrations.CreateModel(
34+
name='Conditions',
35+
fields=[
36+
('condition_id', models.BigAutoField(primary_key=True, serialize=False)),
37+
('condition', models.CharField(max_length=256)),
38+
('deadline', models.DateTimeField()),
39+
('test_file_location', models.CharField(max_length=512, null=True)),
40+
('test_file_type', models.CharField(max_length=256, null=True)),
41+
('submission_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
42+
to='projects.project')),
43+
],
44+
),
45+
migrations.CreateModel(
46+
name='AllowedExtension',
47+
fields=[
48+
('extension_id', models.BigAutoField(primary_key=True, serialize=False)),
49+
('extension', models.IntegerField()),
50+
('project_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.project')),
51+
],
52+
),
2753
]

backend/pigeonhole/apps/projects/models.py

+35-1
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,45 @@ class Project(models.Model):
1010
course_id = models.ForeignKey(Course, on_delete=models.CASCADE)
1111
name = models.CharField(max_length=256)
1212
description = models.TextField()
13-
deadline = models.DateTimeField()
1413
visible = models.BooleanField(default=False)
1514

1615

1716
class ProjectSerializer(serializers.ModelSerializer):
1817
class Meta:
1918
model = Project
2019
fields = ['project_id', 'course_id', 'name', 'description', 'deadline', 'visible']
20+
21+
22+
class Conditions(models.Model):
23+
condition_id = models.BigAutoField(primary_key=True)
24+
submission_id = models.ForeignKey(Project, on_delete=models.CASCADE)
25+
condition = models.CharField(max_length=256)
26+
deadline = models.DateTimeField()
27+
test_file_location = models.CharField(max_length=512, null=True)
28+
test_file_type = models.CharField(max_length=256, null=True)
29+
30+
objects = models.Manager()
31+
32+
@property
33+
def get_forbidden_extensions(self):
34+
return ForbiddenExtension.objects.filter(project_id=self.submission_id)
35+
36+
@property
37+
def get_allowed_extensions(self):
38+
return AllowedExtension.objects.filter(project_id=self.submission_id)
39+
40+
41+
class AllowedExtension(models.Model):
42+
extension_id = models.BigAutoField(primary_key=True)
43+
project_id = models.ForeignKey(Project, on_delete=models.CASCADE)
44+
extension = models.IntegerField()
45+
46+
objects = models.Manager()
47+
48+
49+
class ForbiddenExtension(models.Model):
50+
extension_id = models.BigAutoField(primary_key=True)
51+
project_id = models.ForeignKey(Project, on_delete=models.CASCADE)
52+
extension = models.IntegerField()
53+
54+
objects = models.Manager()
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.0.2 on 2024-03-02 13:21
1+
# Generated by Django 5.0.2 on 2024-03-02 21:03
22

33
import django.db.models.deletion
44
from django.db import migrations, models
@@ -8,22 +8,23 @@ class Migration(migrations.Migration):
88
initial = True
99

1010
dependencies = [
11-
('projects', '0001_initial'),
12-
('users', '0001_initial'),
11+
('groups', '0001_initial'),
1312
]
1413

1514
operations = [
1615
migrations.CreateModel(
1716
name='Submissions',
1817
fields=[
1918
('submission_id', models.BigAutoField(primary_key=True, serialize=False)),
20-
('file', models.FileField(upload_to='uploads/<django.db.models.fields.related.ForeignKey>/'
21-
'<django.db.models.fields.related.ForeignKey>/')),
19+
('submission_nr', models.IntegerField()),
20+
('file', models.FileField(
21+
upload_to='uploads/<django.db.models.fields.related.ForeignKey>/<django.db.models.fields'
22+
'.IntegerField>/')),
2223
('timestamp', models.DateTimeField(auto_now_add=True)),
23-
('project_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE,
24-
to='projects.project')),
25-
('student_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE,
26-
to='users.student')),
24+
('output_test', models.FileField(
25+
upload_to='uploads/<django.db.models.fields.related.ForeignKey>/<django.db.models.fields'
26+
'.IntegerField>/output_test/')),
27+
('group_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='groups.group')),
2728
],
2829
),
2930
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 5.0.2 on 2024-03-02 21:07
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
('submissions', '0001_initial'),
9+
]
10+
11+
operations = [
12+
migrations.AlterField(
13+
model_name='submissions',
14+
name='file',
15+
field=models.FileField(null=True,
16+
upload_to='uploads/<django.db.models.fields.related.ForeignKey>/<django.db.models'
17+
'.fields.IntegerField>/'),
18+
),
19+
migrations.AlterField(
20+
model_name='submissions',
21+
name='output_test',
22+
field=models.FileField(null=True,
23+
upload_to='uploads/<django.db.models.fields.related.ForeignKey>/<django.db.models'
24+
'.fields.IntegerField>/output_test/'),
25+
),
26+
]
+10-6
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
from django.db import models
22
from rest_framework import serializers
33

4-
from backend.pigeonhole.apps.projects.models import Project
5-
from backend.pigeonhole.apps.users.models import Student
4+
from backend.pigeonhole.apps.groups.models import Group
65

76

87
# Create your models here.
98
class Submissions(models.Model):
109
submission_id = models.BigAutoField(primary_key=True)
11-
student_id = models.ForeignKey(Student, on_delete=models.CASCADE, null=True)
12-
project_id = models.ForeignKey(Project, on_delete=models.CASCADE, null=True)
13-
file = models.FileField(upload_to='uploads/' + str(student_id) + '/' + str(project_id) + '/')
10+
group_id = models.ForeignKey(Group, on_delete=models.CASCADE, blank=False)
11+
submission_nr = models.IntegerField()
12+
file = models.FileField(upload_to='uploads/' + str(group_id) + '/' + str(submission_nr) + '/',
13+
null=True, blank=False)
1414
timestamp = models.DateTimeField(auto_now_add=True)
15+
output_test = models.FileField(upload_to='uploads/' + str(group_id) + '/' + str(submission_nr) + '/output_test/',
16+
null=True, blank=False)
17+
18+
objects = models.Manager()
1519

1620

1721
class SubmissionsSerializer(serializers.ModelSerializer):
1822
class Meta:
1923
model = Submissions
20-
fields = ['submission_id', 'student_id', 'project_id', 'file', 'timestamp', 'submission_nr']
24+
fields = ['submission_id', 'group_id', 'file', 'timestamp', 'submission_nr']

backend/pigeonhole/apps/users/migrations/0001_initial.py

+17-17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.0.2 on 2024-03-02 13:17
1+
# Generated by Django 5.0.2 on 2024-03-02 21:03
22

33
import django.contrib.auth.models
44
import django.contrib.auth.validators
@@ -14,7 +14,6 @@ class Migration(migrations.Migration):
1414
dependencies = [
1515
('auth', '0012_alter_user_first_name_max_length'),
1616
('courses', '0001_initial'),
17-
('projects', '0001_initial'),
1817
]
1918

2019
operations = [
@@ -24,30 +23,32 @@ class Migration(migrations.Migration):
2423
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
2524
('password', models.CharField(max_length=128, verbose_name='password')),
2625
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
27-
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all '
28-
'permissions without explicitly '
29-
'assigning them.',
26+
('is_superuser', models.BooleanField(default=False,
27+
help_text='Designates that this user has all permissions '
28+
'without explicitly assigning them.',
3029
verbose_name='superuser status')),
3130
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'},
32-
help_text='Required. 150 characters or fewer. '
33-
'Letters, digits and @/./+/-/_ only.',
31+
help_text='Required. 150 characters or fewer. Letters, digits '
32+
'and @/./+/-/_ only.',
3433
max_length=150, unique=True,
3534
validators=[django.contrib.auth.validators.UnicodeUsernameValidator()],
3635
verbose_name='username')),
3736
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
3837
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
3938
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
40-
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can '
41-
'log into this admin site.',
39+
('is_staff', models.BooleanField(default=False,
40+
help_text='Designates whether the user can log into this admin site.',
4241
verbose_name='staff status')),
43-
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be '
44-
'treated as active. Unselect this instead of '
45-
'deleting accounts.', verbose_name='active')),
42+
('is_active', models.BooleanField(default=True,
43+
help_text='Designates whether this user should be treated as active. '
44+
'Unselect this instead of deleting accounts.',
45+
verbose_name='active')),
4646
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
47-
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will '
48-
'get all permissions granted to each of their '
49-
'groups.', related_name='user_set',
50-
related_query_name='user', to='auth.group', verbose_name='groups')),
47+
('groups', models.ManyToManyField(blank=True,
48+
help_text='The groups this user belongs to. A user will get all '
49+
'permissions granted to each of their groups.',
50+
related_name='user_set', related_query_name='user', to='auth.group',
51+
verbose_name='groups')),
5152
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.',
5253
related_name='user_set', related_query_name='user',
5354
to='auth.permission', verbose_name='user permissions')),
@@ -69,7 +70,6 @@ class Migration(migrations.Migration):
6970
to=settings.AUTH_USER_MODEL)),
7071
('number', models.IntegerField()),
7172
('course', models.ManyToManyField(to='courses.course')),
72-
('project', models.ManyToManyField(to='projects.project')),
7373
],
7474
),
7575
migrations.CreateModel(

backend/pigeonhole/apps/users/models.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from rest_framework import serializers
44

55
from backend.pigeonhole.apps.courses.models import Course
6-
from backend.pigeonhole.apps.projects.models import Project
76

87

98
class User(AbstractUser):
@@ -24,14 +23,15 @@ class Meta:
2423
class Student(models.Model):
2524
id = models.ForeignKey(User, on_delete=models.CASCADE, primary_key=True)
2625
number = models.IntegerField()
27-
project = models.ManyToManyField(Project)
2826
course = models.ManyToManyField(Course)
2927

28+
objects = models.Manager()
29+
3030

3131
class StudentSerializer(serializers.ModelSerializer):
3232
class Meta:
3333
model = Student
34-
fields = ['number', 'project', 'course', 'id']
34+
fields = ['number', 'course', 'id']
3535

3636

3737
class Teacher(models.Model):
@@ -40,6 +40,8 @@ class Teacher(models.Model):
4040
is_admin = models.BooleanField(default=False)
4141
is_assistent = models.BooleanField(default=False)
4242

43+
objects = models.Manager()
44+
4345

4446
class TeacherSerializer(serializers.ModelSerializer):
4547
class Meta:

0 commit comments

Comments
 (0)