From 8b337007a97434cd34f701d077f8d47d615e57c4 Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Wed, 18 Sep 2024 22:33:27 +0200 Subject: [PATCH 01/10] Refactor bdb endpoint to filter on semester --- ...move_company_previous_contacts_and_more.py | 43 +++++++++++++++++++ lego/apps/companies/models.py | 16 ++++--- lego/apps/companies/serializers.py | 12 ++++-- lego/apps/companies/views.py | 6 ++- 4 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 lego/apps/companies/migrations/0029_remove_company_previous_contacts_and_more.py diff --git a/lego/apps/companies/migrations/0029_remove_company_previous_contacts_and_more.py b/lego/apps/companies/migrations/0029_remove_company_previous_contacts_and_more.py new file mode 100644 index 000000000..c890158f4 --- /dev/null +++ b/lego/apps/companies/migrations/0029_remove_company_previous_contacts_and_more.py @@ -0,0 +1,43 @@ +# Generated by Django 4.0.10 on 2024-09-18 18:58 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('companies', '0028_alter_companyinterest_other_offers'), + ] + + operations = [ + migrations.RemoveField( + model_name='company', + name='previous_contacts', + ), + migrations.RemoveField( + model_name='company', + name='student_contact', + ), + migrations.CreateModel( + name='StudentCompanyContact', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(db_index=True, default=django.utils.timezone.now, editable=False)), + ('updated_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)), + ('deleted', models.BooleanField(db_index=True, default=False, editable=False)), + ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_contacts', to='companies.company')), + ('created_by', models.ForeignKey(default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created', to=settings.AUTH_USER_MODEL)), + ('semester', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_contacts', to='companies.semester')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contact_for_companies', to=settings.AUTH_USER_MODEL)), + ('updated_by', models.ForeignKey(default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + 'default_manager_name': 'objects', + }, + ), + ] diff --git a/lego/apps/companies/models.py b/lego/apps/companies/models.py index e97c830c4..cc720beb0 100644 --- a/lego/apps/companies/models.py +++ b/lego/apps/companies/models.py @@ -39,13 +39,8 @@ class Meta: unique_together = ("year", "semester") permission_handler = SemesterPermissionHandler() - class Company(BasisModel): name = models.CharField(max_length=100) - student_contact = models.ForeignKey( - User, related_name="companies", null=True, on_delete=models.SET_NULL - ) - previous_contacts = models.ManyToManyField(User) description = models.TextField(blank=True) phone = models.CharField(max_length=100, blank=True) @@ -71,6 +66,17 @@ def content_target(self) -> str: def __str__(self) -> str: return self.name +class StudentCompanyContact(BasisModel): + company = models.ForeignKey( + Company, related_name="student_contacts", on_delete=models.CASCADE + ) + student = models.ForeignKey( + User, related_name="contact_for_companies", on_delete=models.CASCADE + ) + semester = models.ForeignKey( + Semester, related_name="student_contacts", on_delete=models.CASCADE + ) + class CompanyFile(models.Model): company = models.ForeignKey(Company, related_name="files", on_delete=models.CASCADE) diff --git a/lego/apps/companies/serializers.py b/lego/apps/companies/serializers.py index 3f978f47e..7dd25f077 100644 --- a/lego/apps/companies/serializers.py +++ b/lego/apps/companies/serializers.py @@ -128,20 +128,24 @@ class Meta: class CompanyAdminListSerializer(BasisModelSerializer): - semester_statuses = SemesterStatusSerializer(many=True, read_only=True) - student_contact = PublicUserField(required=False, queryset=User.objects.all()) + semester_status = serializers.SerializerMethodField() class Meta: model = Company fields = ( "id", "name", - "semester_statuses", - "student_contact", + "semester_status", "admin_comment", "active", ) + def get_semester_status(self, obj): + semester_id = self.context.get('semester_id') + semester_status = SemesterStatus.objects.filter(company=obj, semester_id=semester_id).first() + return SemesterStatusSerializer(semester_status).data if semester_status else None + + class CompanyDetailSerializer(BasisModelSerializer): logo = ImageField(required=False, options={"height": 500}) diff --git a/lego/apps/companies/views.py b/lego/apps/companies/views.py index 8f612a1a2..85f8425e3 100644 --- a/lego/apps/companies/views.py +++ b/lego/apps/companies/views.py @@ -48,11 +48,15 @@ class AdminCompanyViewSet(AllowedPermissionsMixin, viewsets.ModelViewSet): queryset = ( Company.objects.all() .prefetch_related("semester_statuses", "files") - .select_related("student_contact") ) pagination_class = None permission_handler = CompanyAdminPermissionHandler() + def get_serializer_context(self): + context = super().get_serializer_context() + context.update({"semester_id": self.request.query_params["semester_id"]}) + return context + def get_serializer_class(self): if self.action == "list": return CompanyAdminListSerializer From c1753ec31930fb99e90701fede75ada01f98f7c4 Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Mon, 23 Sep 2024 09:40:50 +0200 Subject: [PATCH 02/10] Some other changes --- lego/api/v1.py | 2 +- lego/apps/companies/serializers.py | 9 +++++++++ lego/apps/companies/views.py | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lego/api/v1.py b/lego/api/v1.py index 0052ac25e..318c16328 100644 --- a/lego/api/v1.py +++ b/lego/api/v1.py @@ -82,7 +82,7 @@ router = routers.DefaultRouter() router.register(r"announcements", AnnouncementViewSet, basename="announcements") router.register(r"articles", ArticlesViewSet) -router.register(r"bdb", AdminCompanyViewSet, basename="bdb") +router.register(r"bdb/(?P\d+)/companies", AdminCompanyViewSet, basename="bdb") router.register(r"calendar-ical", ICalViewset, basename="calendar-ical") router.register(r"calendar-token", ICalTokenViewset, basename="calendar-token") router.register(r"comments", CommentViewSet) diff --git a/lego/apps/companies/serializers.py b/lego/apps/companies/serializers.py index 7dd25f077..06ddf0422 100644 --- a/lego/apps/companies/serializers.py +++ b/lego/apps/companies/serializers.py @@ -12,9 +12,11 @@ CompanyInterest, Semester, SemesterStatus, + StudentCompanyContact ) from lego.apps.files.fields import FileField, ImageField from lego.apps.users.fields import PublicUserField +from lego.apps.users.serializers.users import PublicUserSerializer from lego.apps.users.models import User from lego.utils.serializers import BasisModelSerializer @@ -129,6 +131,7 @@ class Meta: class CompanyAdminListSerializer(BasisModelSerializer): semester_status = serializers.SerializerMethodField() + student_contact = serializers.SerializerMethodField() class Meta: model = Company @@ -136,10 +139,16 @@ class Meta: "id", "name", "semester_status", + "student_contact", "admin_comment", "active", ) + def get_student_contact(self, obj): + semester_id = self.context.get('semester_id') + student_contact = StudentCompanyContact.objects.filter(company=obj, semester_id=semester_id).first().student_contact + return PublicUserSerializer(student_contact).data if student_contact else None + def get_semester_status(self, obj): semester_id = self.context.get('semester_id') semester_status = SemesterStatus.objects.filter(company=obj, semester_id=semester_id).first() diff --git a/lego/apps/companies/views.py b/lego/apps/companies/views.py index 85f8425e3..10dfc6153 100644 --- a/lego/apps/companies/views.py +++ b/lego/apps/companies/views.py @@ -54,7 +54,7 @@ class AdminCompanyViewSet(AllowedPermissionsMixin, viewsets.ModelViewSet): def get_serializer_context(self): context = super().get_serializer_context() - context.update({"semester_id": self.request.query_params["semester_id"]}) + context.update({"semester_id": self.kwargs["semester_id"]}) return context def get_serializer_class(self): From 93ec39090161fd92680c1547b231022b947f8bfe Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Tue, 1 Oct 2024 12:49:08 +0200 Subject: [PATCH 03/10] Revert to using semester_statuses --- lego/apps/companies/serializers.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lego/apps/companies/serializers.py b/lego/apps/companies/serializers.py index 06ddf0422..32d5f6cb6 100644 --- a/lego/apps/companies/serializers.py +++ b/lego/apps/companies/serializers.py @@ -130,7 +130,7 @@ class Meta: class CompanyAdminListSerializer(BasisModelSerializer): - semester_status = serializers.SerializerMethodField() + semester_statuses = serializers.SerializerMethodField() student_contact = serializers.SerializerMethodField() class Meta: @@ -138,7 +138,7 @@ class Meta: fields = ( "id", "name", - "semester_status", + "semester_statuses", "student_contact", "admin_comment", "active", @@ -146,13 +146,13 @@ class Meta: def get_student_contact(self, obj): semester_id = self.context.get('semester_id') - student_contact = StudentCompanyContact.objects.filter(company=obj, semester_id=semester_id).first().student_contact - return PublicUserSerializer(student_contact).data if student_contact else None + student_company_contact = StudentCompanyContact.objects.filter(company=obj, semester_id=semester_id).first() + return PublicUserSerializer(student_company_contact.student_contact).data if student_company_contact else None - def get_semester_status(self, obj): + def get_semester_statuses(self, obj): semester_id = self.context.get('semester_id') - semester_status = SemesterStatus.objects.filter(company=obj, semester_id=semester_id).first() - return SemesterStatusSerializer(semester_status).data if semester_status else None + semester_statuses = SemesterStatus.objects.filter(company=obj, semester_id=semester_id) + return SemesterStatusSerializer(semester_statuses, many=True).data From 0bad3d54729f47f672e7871e4a973fb840f09095 Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Tue, 1 Oct 2024 13:17:19 +0200 Subject: [PATCH 04/10] Add student company contact to serializer --- lego/apps/companies/serializers.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lego/apps/companies/serializers.py b/lego/apps/companies/serializers.py index 32d5f6cb6..fe119c4d5 100644 --- a/lego/apps/companies/serializers.py +++ b/lego/apps/companies/serializers.py @@ -38,6 +38,11 @@ def create(self, validated_data): return super().create(validated_data) +class StudentCompanyContactSerializer(BasisModelSerializer): + class Meta: + model = StudentCompanyContact + fields = ("id", "company_id", "student_id", "semester_id") + class SemesterStatusDetailSerializer(SemesterStatusSerializer): contract = FileField(required=False, allow_null=True) statistics = FileField(required=False, allow_null=True) @@ -131,7 +136,7 @@ class Meta: class CompanyAdminListSerializer(BasisModelSerializer): semester_statuses = serializers.SerializerMethodField() - student_contact = serializers.SerializerMethodField() + student_contacts = serializers.SerializerMethodField() class Meta: model = Company @@ -139,15 +144,15 @@ class Meta: "id", "name", "semester_statuses", - "student_contact", + "student_contacts", "admin_comment", "active", ) - def get_student_contact(self, obj): + def get_student_contacts(self, obj): semester_id = self.context.get('semester_id') - student_company_contact = StudentCompanyContact.objects.filter(company=obj, semester_id=semester_id).first() - return PublicUserSerializer(student_company_contact.student_contact).data if student_company_contact else None + student_company_contact = StudentCompanyContact.objects.filter(company=obj, semester_id=semester_id) + return StudentCompanyContactSerializer(student_company_contact, many=True).data def get_semester_statuses(self, obj): semester_id = self.context.get('semester_id') From bd8208be2a5d0dd4ebc6744766359366b60f1969 Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Wed, 2 Oct 2024 19:13:07 +0200 Subject: [PATCH 05/10] Make semester_id a query instead --- lego/api/v1.py | 2 +- lego/apps/companies/serializers.py | 18 ++++++++++++++---- lego/apps/companies/views.py | 10 ++++++---- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/lego/api/v1.py b/lego/api/v1.py index 318c16328..0052ac25e 100644 --- a/lego/api/v1.py +++ b/lego/api/v1.py @@ -82,7 +82,7 @@ router = routers.DefaultRouter() router.register(r"announcements", AnnouncementViewSet, basename="announcements") router.register(r"articles", ArticlesViewSet) -router.register(r"bdb/(?P\d+)/companies", AdminCompanyViewSet, basename="bdb") +router.register(r"bdb", AdminCompanyViewSet, basename="bdb") router.register(r"calendar-ical", ICalViewset, basename="calendar-ical") router.register(r"calendar-token", ICalTokenViewset, basename="calendar-token") router.register(r"comments", CommentViewSet) diff --git a/lego/apps/companies/serializers.py b/lego/apps/companies/serializers.py index fe119c4d5..91a79cb2c 100644 --- a/lego/apps/companies/serializers.py +++ b/lego/apps/companies/serializers.py @@ -151,13 +151,23 @@ class Meta: def get_student_contacts(self, obj): semester_id = self.context.get('semester_id') - student_company_contact = StudentCompanyContact.objects.filter(company=obj, semester_id=semester_id) - return StudentCompanyContactSerializer(student_company_contact, many=True).data + + if semester_id == None: + queryset = StudentCompanyContact.objects.filter(company=obj) + else: + queryset = StudentCompanyContact.objects.filter(company=obj, semester_id=semester_id) + + return StudentCompanyContactSerializer(queryset, many=True).data def get_semester_statuses(self, obj): semester_id = self.context.get('semester_id') - semester_statuses = SemesterStatus.objects.filter(company=obj, semester_id=semester_id) - return SemesterStatusSerializer(semester_statuses, many=True).data + + if semester_id == None: + queryset = SemesterStatus.objects.filter(company=obj) + else: + queryset = SemesterStatus.objects.filter(company=obj, semester_id=semester_id) + + return SemesterStatusSerializer(queryset, many=True).data diff --git a/lego/apps/companies/views.py b/lego/apps/companies/views.py index 10dfc6153..58acd90e2 100644 --- a/lego/apps/companies/views.py +++ b/lego/apps/companies/views.py @@ -52,10 +52,12 @@ class AdminCompanyViewSet(AllowedPermissionsMixin, viewsets.ModelViewSet): pagination_class = None permission_handler = CompanyAdminPermissionHandler() - def get_serializer_context(self): - context = super().get_serializer_context() - context.update({"semester_id": self.kwargs["semester_id"]}) - return context + def _list(self, request, *args, **kwargs): + semester_id = request.query_params.get('semester_id', None) + + serializer = self.get_serializer(self.queryset, many=True, context={'semester_id': semester_id}) + + return Response(serializer.data) def get_serializer_class(self): if self.action == "list": From e18045414cd5565e63e768185227b118d161daa0 Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Wed, 2 Oct 2024 19:59:13 +0200 Subject: [PATCH 06/10] Update CompanyDetail --- lego/apps/companies/serializers.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lego/apps/companies/serializers.py b/lego/apps/companies/serializers.py index 91a79cb2c..81e80f3f6 100644 --- a/lego/apps/companies/serializers.py +++ b/lego/apps/companies/serializers.py @@ -206,9 +206,7 @@ class CompanyAdminDetailSerializer(BasisModelSerializer): comments = CommentSerializer(read_only=True, many=True) content_target = CharField(read_only=True) - student_contact = PublicUserField( - required=False, allow_null=True, queryset=User.objects.all() - ) + student_contacts = StudentCompanyContactSerializer(many=True) semester_statuses = SemesterStatusDetailSerializer(many=True, read_only=True) company_contacts = CompanyContactSerializer(many=True, read_only=True) @@ -220,7 +218,7 @@ class Meta: fields = ( "id", "name", - "student_contact", + "student_contacts", "description", "phone", "company_type", From c64f12da78f401c2b9b8988ccdeff9e0372e2486 Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Wed, 9 Oct 2024 22:14:42 +0200 Subject: [PATCH 07/10] Format --- ...move_company_previous_contacts_and_more.py | 100 ++++++++++++++---- lego/apps/companies/models.py | 2 + lego/apps/companies/serializers.py | 18 ++-- lego/apps/companies/views.py | 11 +- 4 files changed, 99 insertions(+), 32 deletions(-) diff --git a/lego/apps/companies/migrations/0029_remove_company_previous_contacts_and_more.py b/lego/apps/companies/migrations/0029_remove_company_previous_contacts_and_more.py index c890158f4..bc3e80546 100644 --- a/lego/apps/companies/migrations/0029_remove_company_previous_contacts_and_more.py +++ b/lego/apps/companies/migrations/0029_remove_company_previous_contacts_and_more.py @@ -1,43 +1,105 @@ # Generated by Django 4.0.10 on 2024-09-18 18:58 -from django.conf import settings -from django.db import migrations, models import django.db.models.deletion import django.utils.timezone +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('companies', '0028_alter_companyinterest_other_offers'), + ("companies", "0028_alter_companyinterest_other_offers"), ] operations = [ migrations.RemoveField( - model_name='company', - name='previous_contacts', + model_name="company", + name="previous_contacts", ), migrations.RemoveField( - model_name='company', - name='student_contact', + model_name="company", + name="student_contact", ), migrations.CreateModel( - name='StudentCompanyContact', + name="StudentCompanyContact", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(db_index=True, default=django.utils.timezone.now, editable=False)), - ('updated_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)), - ('deleted', models.BooleanField(db_index=True, default=False, editable=False)), - ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_contacts', to='companies.company')), - ('created_by', models.ForeignKey(default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created', to=settings.AUTH_USER_MODEL)), - ('semester', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_contacts', to='companies.semester')), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contact_for_companies', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated', to=settings.AUTH_USER_MODEL)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + db_index=True, default=django.utils.timezone.now, editable=False + ), + ), + ( + "updated_at", + models.DateTimeField( + default=django.utils.timezone.now, editable=False + ), + ), + ( + "deleted", + models.BooleanField(db_index=True, default=False, editable=False), + ), + ( + "company", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="student_contacts", + to="companies.company", + ), + ), + ( + "created_by", + models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "semester", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="student_contacts", + to="companies.semester", + ), + ), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="contact_for_companies", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "updated_by", + models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), ], options={ - 'abstract': False, - 'default_manager_name': 'objects', + "abstract": False, + "default_manager_name": "objects", }, ), ] diff --git a/lego/apps/companies/models.py b/lego/apps/companies/models.py index cc720beb0..37b799ed5 100644 --- a/lego/apps/companies/models.py +++ b/lego/apps/companies/models.py @@ -39,6 +39,7 @@ class Meta: unique_together = ("year", "semester") permission_handler = SemesterPermissionHandler() + class Company(BasisModel): name = models.CharField(max_length=100) @@ -66,6 +67,7 @@ def content_target(self) -> str: def __str__(self) -> str: return self.name + class StudentCompanyContact(BasisModel): company = models.ForeignKey( Company, related_name="student_contacts", on_delete=models.CASCADE diff --git a/lego/apps/companies/serializers.py b/lego/apps/companies/serializers.py index 81e80f3f6..271b8edef 100644 --- a/lego/apps/companies/serializers.py +++ b/lego/apps/companies/serializers.py @@ -12,12 +12,12 @@ CompanyInterest, Semester, SemesterStatus, - StudentCompanyContact + StudentCompanyContact, ) from lego.apps.files.fields import FileField, ImageField from lego.apps.users.fields import PublicUserField -from lego.apps.users.serializers.users import PublicUserSerializer from lego.apps.users.models import User +from lego.apps.users.serializers.users import PublicUserSerializer from lego.utils.serializers import BasisModelSerializer @@ -43,6 +43,7 @@ class Meta: model = StudentCompanyContact fields = ("id", "company_id", "student_id", "semester_id") + class SemesterStatusDetailSerializer(SemesterStatusSerializer): contract = FileField(required=False, allow_null=True) statistics = FileField(required=False, allow_null=True) @@ -150,27 +151,30 @@ class Meta: ) def get_student_contacts(self, obj): - semester_id = self.context.get('semester_id') + semester_id = self.context.get("semester_id") if semester_id == None: queryset = StudentCompanyContact.objects.filter(company=obj) else: - queryset = StudentCompanyContact.objects.filter(company=obj, semester_id=semester_id) + queryset = StudentCompanyContact.objects.filter( + company=obj, semester_id=semester_id + ) return StudentCompanyContactSerializer(queryset, many=True).data def get_semester_statuses(self, obj): - semester_id = self.context.get('semester_id') + semester_id = self.context.get("semester_id") if semester_id == None: queryset = SemesterStatus.objects.filter(company=obj) else: - queryset = SemesterStatus.objects.filter(company=obj, semester_id=semester_id) + queryset = SemesterStatus.objects.filter( + company=obj, semester_id=semester_id + ) return SemesterStatusSerializer(queryset, many=True).data - class CompanyDetailSerializer(BasisModelSerializer): logo = ImageField(required=False, options={"height": 500}) logo_placeholder = ImageField( diff --git a/lego/apps/companies/views.py b/lego/apps/companies/views.py index 58acd90e2..559273826 100644 --- a/lego/apps/companies/views.py +++ b/lego/apps/companies/views.py @@ -45,17 +45,16 @@ class AdminCompanyViewSet(AllowedPermissionsMixin, viewsets.ModelViewSet): - queryset = ( - Company.objects.all() - .prefetch_related("semester_statuses", "files") - ) + queryset = Company.objects.all().prefetch_related("semester_statuses", "files") pagination_class = None permission_handler = CompanyAdminPermissionHandler() def _list(self, request, *args, **kwargs): - semester_id = request.query_params.get('semester_id', None) + semester_id = request.query_params.get("semester_id", None) - serializer = self.get_serializer(self.queryset, many=True, context={'semester_id': semester_id}) + serializer = self.get_serializer( + self.queryset, many=True, context={"semester_id": semester_id} + ) return Response(serializer.data) From c92d07ef0d6fa37f724c79f238e8238e24662303 Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Wed, 9 Oct 2024 22:51:37 +0200 Subject: [PATCH 08/10] Fix lint --- lego/apps/companies/serializers.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lego/apps/companies/serializers.py b/lego/apps/companies/serializers.py index 271b8edef..f11fae334 100644 --- a/lego/apps/companies/serializers.py +++ b/lego/apps/companies/serializers.py @@ -15,9 +15,6 @@ StudentCompanyContact, ) from lego.apps.files.fields import FileField, ImageField -from lego.apps.users.fields import PublicUserField -from lego.apps.users.models import User -from lego.apps.users.serializers.users import PublicUserSerializer from lego.utils.serializers import BasisModelSerializer @@ -153,7 +150,7 @@ class Meta: def get_student_contacts(self, obj): semester_id = self.context.get("semester_id") - if semester_id == None: + if semester_id is None: queryset = StudentCompanyContact.objects.filter(company=obj) else: queryset = StudentCompanyContact.objects.filter( @@ -165,7 +162,7 @@ def get_student_contacts(self, obj): def get_semester_statuses(self, obj): semester_id = self.context.get("semester_id") - if semester_id == None: + if semester_id is None: queryset = SemesterStatus.objects.filter(company=obj) else: queryset = SemesterStatus.objects.filter( From 9623e06e3ab88fb19e13d5c6bcd2260b059e09be Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Fri, 11 Oct 2024 16:44:45 +0200 Subject: [PATCH 09/10] Update tests n stuff --- .../companies/fixtures/development_companies.yaml | 3 --- lego/apps/companies/fixtures/test_companies.yaml | 3 --- lego/apps/companies/serializers.py | 2 +- lego/apps/companies/views.py | 12 ++++++------ 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/lego/apps/companies/fixtures/development_companies.yaml b/lego/apps/companies/fixtures/development_companies.yaml index c4f21f508..49162fa10 100644 --- a/lego/apps/companies/fixtures/development_companies.yaml +++ b/lego/apps/companies/fixtures/development_companies.yaml @@ -31,7 +31,6 @@ fields: name: 'BEKK' description: 'Bekk Consulting AS er et norsk konsulentselskap. Vi gjennomfører prosjekter for store private og offentlige virksomheter innen strategisk rådgivning, utvikling av IT-systemer og design av digitale tjenester. Vi er i dag over 370 fagpersoner.' - student_contact: 1 phone: '+47 90909090' website: 'bekk.no' payment_mail: faktura@bekk.no @@ -43,7 +42,6 @@ pk: 2 fields: name: 'Facebook' - student_contact: 2 phone: '123 45 678' - model: companies.Company @@ -51,7 +49,6 @@ fields: name: 'Itera' description: 'Itera er et kommunikasjons- og teknologiselskap. Vi leverer tjenester innen rådgivning og strategi, design og utvikling, drift og forvaltning. Vi er engasjerte fagspesialister som jobber i tverrfaglige team fordi vi vet at vi med ulike faglige ståsteder avdekker helt nye muligheter og løsninger som gir verdi til kundene våre.' - student_contact: 3 phone: '' # Company 1 diff --git a/lego/apps/companies/fixtures/test_companies.yaml b/lego/apps/companies/fixtures/test_companies.yaml index f14e77807..aef593e59 100644 --- a/lego/apps/companies/fixtures/test_companies.yaml +++ b/lego/apps/companies/fixtures/test_companies.yaml @@ -14,7 +14,6 @@ pk: 1 fields: name: 'Facebook' - student_contact: 2 phone: '123 45 678' - model: companies.Company @@ -22,7 +21,6 @@ fields: name: 'Itera' description: 'Itera er et kommunikasjons- og teknologiselskap. Vi leverer tjenester innen rådgivning og strategi, design og utvikling, drift og forvaltning. Vi er engasjerte fagspesialister som jobber i tverrfaglige team fordi vi vet at vi med ulike faglige ståsteder avdekker helt nye muligheter og løsninger som gir verdi til kundene våre.' - student_contact: 3 phone: '' - model: companies.Company @@ -30,7 +28,6 @@ fields: name: 'Webkom' description: 'Webkom er webkom' - student_contact: 3 phone: '' - model: companies.SemesterStatus diff --git a/lego/apps/companies/serializers.py b/lego/apps/companies/serializers.py index f11fae334..3e1d3f588 100644 --- a/lego/apps/companies/serializers.py +++ b/lego/apps/companies/serializers.py @@ -207,7 +207,7 @@ class CompanyAdminDetailSerializer(BasisModelSerializer): comments = CommentSerializer(read_only=True, many=True) content_target = CharField(read_only=True) - student_contacts = StudentCompanyContactSerializer(many=True) + student_contacts = StudentCompanyContactSerializer(many=True, read_only=True) semester_statuses = SemesterStatusDetailSerializer(many=True, read_only=True) company_contacts = CompanyContactSerializer(many=True, read_only=True) diff --git a/lego/apps/companies/views.py b/lego/apps/companies/views.py index 559273826..70b498bfb 100644 --- a/lego/apps/companies/views.py +++ b/lego/apps/companies/views.py @@ -49,14 +49,14 @@ class AdminCompanyViewSet(AllowedPermissionsMixin, viewsets.ModelViewSet): pagination_class = None permission_handler = CompanyAdminPermissionHandler() - def _list(self, request, *args, **kwargs): - semester_id = request.query_params.get("semester_id", None) + def get_serializer_context(self): + context = super().get_serializer_context() - serializer = self.get_serializer( - self.queryset, many=True, context={"semester_id": semester_id} - ) + if self.action == "list": + semester_id = self.request.query_params.get("semester_id", None) + context.update({"semester_id": semester_id}) - return Response(serializer.data) + return context def get_serializer_class(self): if self.action == "list": From e08e352aa7ae3ca63dac5ede3cf0ad4f23d17af3 Mon Sep 17 00:00:00 2001 From: Falk Bruskeland Date: Fri, 11 Oct 2024 17:26:53 +0200 Subject: [PATCH 10/10] Add tests --- lego/apps/companies/fixtures/test_companies.yaml | 15 +++++++++++++++ .../companies/tests/test_companies_admin_api.py | 13 +++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lego/apps/companies/fixtures/test_companies.yaml b/lego/apps/companies/fixtures/test_companies.yaml index aef593e59..af8f9ccff 100644 --- a/lego/apps/companies/fixtures/test_companies.yaml +++ b/lego/apps/companies/fixtures/test_companies.yaml @@ -37,6 +37,21 @@ company: 1 contacted_status: ['interested'] +- model: companies.StudentCompanyContact + pk: 1 + fields: + company: 1 + student: 1 + semester: 1 + +- model: companies.StudentCompanyContact + pk: 2 + fields: + company: 1 + student: 2 + semester: 2 + + - model: companies.CompanyContact pk: 1 fields: diff --git a/lego/apps/companies/tests/test_companies_admin_api.py b/lego/apps/companies/tests/test_companies_admin_api.py index 286f2028b..54946f3f3 100644 --- a/lego/apps/companies/tests/test_companies_admin_api.py +++ b/lego/apps/companies/tests/test_companies_admin_api.py @@ -67,6 +67,19 @@ def test_with_bedkom_user(self): company_response = self.client.get(_get_bdb_list_url()) self.assertEqual(company_response.status_code, status.HTTP_200_OK) self.assertEqual(len(company_response.json()["results"]), 3) + self.assertEqual( + len(company_response.json()["results"][0]["studentContacts"]), 2 + ) + + def test_with_semester_query(self): + AbakusGroup.objects.get(name="Bedkom").add_user(self.abakus_user) + self.client.force_authenticate(self.abakus_user) + company_response = self.client.get(_get_bdb_list_url(), {"semester_id": 1}) + self.assertEqual(company_response.status_code, status.HTTP_200_OK) + self.assertEqual(len(company_response.json()["results"]), 3) + self.assertEqual( + len(company_response.json()["results"][0]["studentContacts"]), 1 + ) class RetrieveCompaniesTestCase(BaseAPITestCase):