From f31922f66b8e2eafcf97b8decec2cef7211c117b Mon Sep 17 00:00:00 2001 From: EwoutV Date: Wed, 3 Apr 2024 12:50:16 +0200 Subject: [PATCH 01/15] chore: course-faculty relation, faculty name translations --- backend/api/fixtures/courses.yaml | 3 ++ backend/api/migrations/0008_course_faculty.py | 20 +++++++++++ backend/api/models/course.py | 10 ++++++ backend/api/serializers/course_serializer.py | 5 +++ backend/api/serializers/faculty_serializer.py | 8 ++++- backend/api/views/faculty_view.py | 4 +-- .../authentication/fixtures/faculties.yaml | 33 ++++++++++++------- .../locale/en/LC_MESSAGES/django.po | 32 ++++++++++++++++++ .../locale/nl/LC_MESSAGES/django.po | 32 ++++++++++++++++++ ...ame_name_faculty_id_faculty_description.py | 23 +++++++++++++ .../0003_rename_description_faculty_name.py | 18 ++++++++++ backend/authentication/models.py | 8 ++++- .../src/views/courses/SearchCourseView.vue | 11 +++++++ 13 files changed, 192 insertions(+), 15 deletions(-) create mode 100644 backend/api/migrations/0008_course_faculty.py create mode 100644 backend/authentication/locale/en/LC_MESSAGES/django.po create mode 100644 backend/authentication/locale/nl/LC_MESSAGES/django.po create mode 100644 backend/authentication/migrations/0002_rename_name_faculty_id_faculty_description.py create mode 100644 backend/authentication/migrations/0003_rename_description_faculty_name.py create mode 100644 frontend/src/views/courses/SearchCourseView.vue diff --git a/backend/api/fixtures/courses.yaml b/backend/api/fixtures/courses.yaml index 4a8677c9..db630628 100644 --- a/backend/api/fixtures/courses.yaml +++ b/backend/api/fixtures/courses.yaml @@ -5,6 +5,7 @@ academic_startyear: 2023 description: Math course parent_course: null + faculty: "Letteren_Wijsbegeerte" - model: api.course pk: 2 fields: @@ -12,6 +13,7 @@ academic_startyear: 2023 description: Software course parent_course: 3 + faculty: "Ingenieurswetenschappen_Architectuur" - model: api.course pk: 3 fields: @@ -19,3 +21,4 @@ academic_startyear: 2022 description: Software course parent_course: null + faculty: "Wetenschappen" diff --git a/backend/api/migrations/0008_course_faculty.py b/backend/api/migrations/0008_course_faculty.py new file mode 100644 index 00000000..e7641849 --- /dev/null +++ b/backend/api/migrations/0008_course_faculty.py @@ -0,0 +1,20 @@ +# Generated by Django 5.0.3 on 2024-04-03 10:01 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0007_merge_20240313_0639'), + ('authentication', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='course', + name='faculty', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='authentication.faculty'), + ), + ] diff --git a/backend/api/models/course.py b/backend/api/models/course.py index b4fdb972..3612827c 100644 --- a/backend/api/models/course.py +++ b/backend/api/models/course.py @@ -2,6 +2,8 @@ from typing import Self from django.db import models +from authentication.models import Faculty + class Course(models.Model): """This model represents a single course. @@ -14,8 +16,16 @@ class Course(models.Model): # Begin year of the academic year academic_startyear = models.IntegerField(blank=False, null=False) + # The description of the course description = models.TextField(blank=True, null=True) + # The faculty this course belongs to + faculty = models.ForeignKey( + Faculty, + null=True, + on_delete=models.SET_NULL + ) + # OneToOneField is used to represent a one-to-one relationship # with the course of the previous academic year parent_course = models.OneToOneField( diff --git a/backend/api/serializers/course_serializer.py b/backend/api/serializers/course_serializer.py index 4d7cf067..38b4c281 100644 --- a/backend/api/serializers/course_serializer.py +++ b/backend/api/serializers/course_serializer.py @@ -3,6 +3,7 @@ from rest_framework.exceptions import ValidationError from api.serializers.student_serializer import StudentIDSerializer from api.serializers.teacher_serializer import TeacherIDSerializer +from api.serializers.faculty_serializer import FacultySerializer from api.models.course import Course @@ -31,6 +32,10 @@ class CourseSerializer(serializers.ModelSerializer): many=False, read_only=True, view_name="course-detail" ) + faculty = FacultySerializer( + read_only=True + ) + class Meta: model = Course fields = "__all__" diff --git a/backend/api/serializers/faculty_serializer.py b/backend/api/serializers/faculty_serializer.py index 57bb9bbf..eed3fde7 100644 --- a/backend/api/serializers/faculty_serializer.py +++ b/backend/api/serializers/faculty_serializer.py @@ -1,8 +1,14 @@ +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from authentication.models import Faculty -class facultySerializer(serializers.ModelSerializer): +class FacultySerializer(serializers.ModelSerializer): + name = serializers.SerializerMethodField() + + def get_name(self, data) -> str: + return _(data.name) + class Meta: model = Faculty fields = "__all__" diff --git a/backend/api/views/faculty_view.py b/backend/api/views/faculty_view.py index fc8c71ca..eb5423ac 100644 --- a/backend/api/views/faculty_view.py +++ b/backend/api/views/faculty_view.py @@ -2,10 +2,10 @@ from rest_framework.permissions import IsAdminUser from authentication.models import Faculty from api.permissions.faculty_permissions import FacultyPermission -from ..serializers.faculty_serializer import facultySerializer +from ..serializers.faculty_serializer import FacultySerializer class FacultyViewSet(viewsets.ModelViewSet): queryset = Faculty.objects.all() - serializer_class = facultySerializer + serializer_class = FacultySerializer permission_classes = [IsAdminUser | FacultyPermission] diff --git a/backend/authentication/fixtures/faculties.yaml b/backend/authentication/fixtures/faculties.yaml index e13fd9e5..66b69d4c 100644 --- a/backend/authentication/fixtures/faculties.yaml +++ b/backend/authentication/fixtures/faculties.yaml @@ -1,33 +1,44 @@ - model: authentication.faculty pk: Bio-ingenieurswetenschappen - fields: {} + fields: + name: "faculties.bioscience_engineering" - model: authentication.faculty pk: Diergeneeskunde - fields: {} + fields: + name: "faculties.veterinary_medicine" - model: authentication.faculty pk: Economie_Bedrijfskunde - fields: {} + fields: + name: "faculties.economics_business_administration" - model: authentication.faculty pk: Farmaceutische_Wetenschappen - fields: {} + fields: + name: "faculties.pharmaceutical_sciences" - model: authentication.faculty pk: Geneeskunde_Gezondheidswetenschappen - fields: {} + fields: + name: "faculties.medicine_health_sciences" - model: authentication.faculty pk: Ingenieurswetenschappen_Architectuur - fields: {} + fields: + name: "faculties.engineering_architecture" - model: authentication.faculty pk: Letteren_Wijsbegeerte - fields: {} + fields: + name: "faculties.arts_philosophy" - model: authentication.faculty pk: Politieke_Sociale_Wetenschappen - fields: {} + fields: + name: "faculties.political_social_sciences" - model: authentication.faculty pk: Psychologie_PedagogischeWetenschappen - fields: {} + fields: + name: "faculties.psychology_educational_sciences" - model: authentication.faculty pk: Recht_Criminologie - fields: {} + fields: + name: "faculties.law_criminology" - model: authentication.faculty pk: Wetenschappen - fields: {} + fields: + name: "faculties.sciences" diff --git a/backend/authentication/locale/en/LC_MESSAGES/django.po b/backend/authentication/locale/en/LC_MESSAGES/django.po new file mode 100644 index 00000000..9ee53ff5 --- /dev/null +++ b/backend/authentication/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,32 @@ +msgid "faculties.bioscience_engineering" +msgstr "Bioscience Engineering" + +msgid "faculties.veterinary_medicine" +msgstr "Veterinary Medicine" + +msgid "faculties.economics_business_administration" +msgstr "Economics and Business Administration" + +msgid "faculties.pharmaceutical_sciences" +msgstr "Pharmaceutical Sciences" + +msgid "faculties.medicine_health_sciences" +msgstr "Medicine and Health Sciences" + +msgid "faculties.engineering_architecture" +msgstr "Engineering and Architecture" + +msgid "faculties.arts_philosophy" +msgstr "Arts and Philosophy" + +msgid "faculties.political_social_sciences" +msgstr "Political and Social Sciences" + +msgid "faculties.psychology_educational_sciences" +msgstr "Psychology and Educational Sciences" + +msgid "faculties.law_criminology" +msgstr "Law and Criminology" + +msgid "faculties.sciences" +msgstr "Sciences" \ No newline at end of file diff --git a/backend/authentication/locale/nl/LC_MESSAGES/django.po b/backend/authentication/locale/nl/LC_MESSAGES/django.po new file mode 100644 index 00000000..b3ec5337 --- /dev/null +++ b/backend/authentication/locale/nl/LC_MESSAGES/django.po @@ -0,0 +1,32 @@ +msgid "faculties.bioscience_engineering" +msgstr "Bio-ingenieurswetenschappen" + +msgid "faculties.veterinary_medicine" +msgstr "Diergeneeskunde" + +msgid "faculties.economics_business_administration" +msgstr "Economie en Bedrijfskunde" + +msgid "faculties.pharmaceutical_sciences" +msgstr "Farmaceutische Wetenschappen" + +msgid "faculties.medicine_health_sciences" +msgstr "Geneeskunde en Gezondheidswetenschappen" + +msgid "faculties.engineering_architecture" +msgstr "Ingenieurswetenschappen en Architectuur" + +msgid "faculties.arts_philosophy" +msgstr "Letteren en Wijsbegeerte" + +msgid "faculties.political_social_sciences" +msgstr "Politieke en Sociale Wetenschappen" + +msgid "faculties.psychology_educational_sciences" +msgstr "Psychologie en Pedagogische Wetenschappen" + +msgid "faculties.law_criminology" +msgstr "Recht en Criminologie" + +msgid "faculties.science" +msgstr "Wetenschappen" \ No newline at end of file diff --git a/backend/authentication/migrations/0002_rename_name_faculty_id_faculty_description.py b/backend/authentication/migrations/0002_rename_name_faculty_id_faculty_description.py new file mode 100644 index 00000000..3e22f1ad --- /dev/null +++ b/backend/authentication/migrations/0002_rename_name_faculty_id_faculty_description.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0.3 on 2024-04-03 10:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='faculty', + old_name='name', + new_name='id', + ), + migrations.AddField( + model_name='faculty', + name='description', + field=models.CharField(default='faculty', max_length=50), + ), + ] diff --git a/backend/authentication/migrations/0003_rename_description_faculty_name.py b/backend/authentication/migrations/0003_rename_description_faculty_name.py new file mode 100644 index 00000000..1ec0cc3e --- /dev/null +++ b/backend/authentication/migrations/0003_rename_description_faculty_name.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.3 on 2024-04-03 10:32 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0002_rename_name_faculty_id_faculty_description'), + ] + + operations = [ + migrations.RenameField( + model_name='faculty', + old_name='description', + new_name='name', + ), + ] diff --git a/backend/authentication/models.py b/backend/authentication/models.py index 71eadc53..e7f3e7dd 100644 --- a/backend/authentication/models.py +++ b/backend/authentication/models.py @@ -72,4 +72,10 @@ class Faculty(models.Model): """This model represents a faculty.""" """Model fields""" - name = CharField(max_length=50, primary_key=True) + id = CharField(max_length=50, primary_key=True) + + name = CharField( + max_length=50, + default="faculty", + null=False + ) diff --git a/frontend/src/views/courses/SearchCourseView.vue b/frontend/src/views/courses/SearchCourseView.vue new file mode 100644 index 00000000..23c3bb1c --- /dev/null +++ b/frontend/src/views/courses/SearchCourseView.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file From fa2dcc45a017fe2b06c8091687e4c1a4e8585685 Mon Sep 17 00:00:00 2001 From: EwoutV Date: Wed, 3 Apr 2024 12:57:39 +0200 Subject: [PATCH 02/15] chore: added debug option to echo user credentials upon login --- backend/authentication/views.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/authentication/views.py b/backend/authentication/views.py index 9836e3e5..c1694a02 100644 --- a/backend/authentication/views.py +++ b/backend/authentication/views.py @@ -18,8 +18,13 @@ class CASViewSet(ViewSet): permission_classes = [IsAuthenticated] @action(detail=False, methods=['GET'], permission_classes=[AllowAny]) - def login(self, _: Request) -> Response: + def login(self, request: Request) -> Response: """Attempt to log in. Redirect to our single CAS endpoint.""" + should_echo = request.query_params.get('echo', False) + + if should_echo and settings.DEBUG: + client._service_url = 'https://localhost:8080/api/auth/cas/echo' + return redirect(client.get_login_url()) @action(detail=False, methods=['POST']) From a5492f5af83d833f17afbc67b4704e85430dcac7 Mon Sep 17 00:00:00 2001 From: EwoutV Date: Wed, 3 Apr 2024 13:00:00 +0200 Subject: [PATCH 03/15] fix: debug parameter --- backend/authentication/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/authentication/views.py b/backend/authentication/views.py index c1694a02..bb401cd0 100644 --- a/backend/authentication/views.py +++ b/backend/authentication/views.py @@ -22,7 +22,7 @@ def login(self, request: Request) -> Response: """Attempt to log in. Redirect to our single CAS endpoint.""" should_echo = request.query_params.get('echo', False) - if should_echo and settings.DEBUG: + if should_echo == "1" and settings.DEBUG: client._service_url = 'https://localhost:8080/api/auth/cas/echo' return redirect(client.get_login_url()) From 6aebd453d360ab082d8409c8326dc8cc6d5c46fc Mon Sep 17 00:00:00 2001 From: EwoutV Date: Wed, 3 Apr 2024 18:06:39 +0200 Subject: [PATCH 04/15] feat: course list --- backend/api/views/pagination/__init__.py | 0 .../api/views/pagination/basic_pagination.py | 0 frontend/.prettierrc | 5 +- .../faculties/Bio-ingenieurswetenschappen.png | Bin 0 -> 1143 bytes .../assets/img/faculties/Diergeneeskunde.png | Bin 0 -> 848 bytes .../img/faculties/Economie_Bedrijfskunde.png | Bin 0 -> 322 bytes .../Farmaceutische_Wetenschappen.png | Bin 0 -> 616 bytes .../Geneeskunde_Gezondheidswetenschappen.png | Bin 0 -> 684 bytes .../Ingenieurswetenschappen_Architectuur.png | Bin 0 -> 321 bytes .../img/faculties/Letteren_Wijsbegeerte.png | Bin 0 -> 486 bytes .../Politieke_Sociale_Wetenschappen.png | Bin 0 -> 975 bytes .../img/faculties/Recht_Criminologie.png | Bin 0 -> 721 bytes .../assets/img/faculties/Wetenschappen.png | Bin 0 -> 804 bytes .../src/assets/scss/theme/_variables.scss | 42 +-- frontend/src/components/LanguageSelector.vue | 5 +- frontend/src/components/RoleSelector.vue | 16 +- frontend/src/components/YearSelector.vue | 17 +- .../{CourseCard.vue => CourseDetailCard.vue} | 21 +- .../components/courses/CourseGeneralCard.vue | 93 +++++ .../src/components/courses/CourseList.vue | 33 +- frontend/src/components/layout/Body.vue | 2 +- frontend/src/components/layout/Footer.vue | 5 +- frontend/src/components/layout/Header.vue | 29 +- .../src/components/projects/GroupCard.vue | 4 +- .../src/components/projects/ProjectCard.vue | 21 +- .../src/components/projects/ProjectList.vue | 5 +- .../composables/services/admins.service.ts | 7 +- .../composables/services/assistant.service.ts | 62 +++- .../composables/services/courses.service.ts | 52 ++- .../composables/services/faculties.service.ts | 20 +- .../composables/services/groups.service.ts | 27 +- frontend/src/composables/services/helpers.ts | 75 +++- .../composables/services/project.service.ts | 68 +++- .../services/structure_check.service.ts | 49 ++- .../composables/services/students.service.ts | 91 ++++- .../services/submission.service.ts | 32 +- .../services/submission_status.service.ts | 15 +- .../composables/services/teachers.service.ts | 52 ++- frontend/src/config/endpoints.ts | 1 + .../src/router/guards/authentication.guard.ts | 4 +- frontend/src/router/guards/logout.guard.ts | 11 +- frontend/src/router/router.ts | 9 +- frontend/src/test/unit/admin_service.test.ts | 24 +- .../src/test/unit/assistant_service.test.ts | 20 +- .../src/test/unit/faculty_service.test.ts | 4 +- .../src/test/unit/project_service.test.ts | 40 ++- frontend/src/test/unit/setup.ts | 333 ++++++++++++------ .../src/test/unit/student_service.test.ts | 44 ++- .../src/test/unit/submission_service.test.ts | 20 +- .../unit/submission_status_service.test.ts | 3 +- .../src/test/unit/teacher_service.test.ts | 20 +- frontend/src/types/Course.ts | 30 +- frontend/src/types/Faculty.ts | 7 +- frontend/src/types/Group.ts | 8 +- frontend/src/types/Pagination.ts | 18 + frontend/src/types/users/Assistant.ts | 19 +- frontend/src/types/users/Student.ts | 40 ++- frontend/src/types/users/Teacher.ts | 15 +- frontend/src/types/users/User.ts | 5 +- frontend/src/views/App.vue | 5 +- .../src/views/authentication/LoginView.vue | 15 +- frontend/src/views/calendar/CalendarView.vue | 21 +- .../src/views/courses/CreateCourseView.vue | 38 +- .../src/views/courses/SearchCourseView.vue | 85 ++++- .../dashboard/roles/StudentDashboardView.vue | 21 +- frontend/src/views/projects/ProjectView.vue | 4 +- 66 files changed, 1361 insertions(+), 351 deletions(-) create mode 100644 backend/api/views/pagination/__init__.py create mode 100644 backend/api/views/pagination/basic_pagination.py create mode 100644 frontend/src/assets/img/faculties/Bio-ingenieurswetenschappen.png create mode 100644 frontend/src/assets/img/faculties/Diergeneeskunde.png create mode 100644 frontend/src/assets/img/faculties/Economie_Bedrijfskunde.png create mode 100644 frontend/src/assets/img/faculties/Farmaceutische_Wetenschappen.png create mode 100644 frontend/src/assets/img/faculties/Geneeskunde_Gezondheidswetenschappen.png create mode 100644 frontend/src/assets/img/faculties/Ingenieurswetenschappen_Architectuur.png create mode 100644 frontend/src/assets/img/faculties/Letteren_Wijsbegeerte.png create mode 100644 frontend/src/assets/img/faculties/Politieke_Sociale_Wetenschappen.png create mode 100644 frontend/src/assets/img/faculties/Recht_Criminologie.png create mode 100644 frontend/src/assets/img/faculties/Wetenschappen.png rename frontend/src/components/courses/{CourseCard.vue => CourseDetailCard.vue} (63%) create mode 100644 frontend/src/components/courses/CourseGeneralCard.vue create mode 100644 frontend/src/types/Pagination.ts diff --git a/backend/api/views/pagination/__init__.py b/backend/api/views/pagination/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/api/views/pagination/basic_pagination.py b/backend/api/views/pagination/basic_pagination.py new file mode 100644 index 00000000..e69de29b diff --git a/frontend/.prettierrc b/frontend/.prettierrc index f9ca8c32..57a4acdb 100644 --- a/frontend/.prettierrc +++ b/frontend/.prettierrc @@ -1,11 +1,10 @@ { "tabWidth": 4, - "printWidth": 140, - "max_line_length": 140, + "printWidth": 80, + "max_line_length": 80, "semi": true, "singleQuote": true, "arrowParens": "always", - "wrapParens": "avoid", "endOfLine": "auto", "jsxBracketSameLine": true, "bracketSameLine": true diff --git a/frontend/src/assets/img/faculties/Bio-ingenieurswetenschappen.png b/frontend/src/assets/img/faculties/Bio-ingenieurswetenschappen.png new file mode 100644 index 0000000000000000000000000000000000000000..253b49c2f2fda454edc98cdcf945194e555a65a6 GIT binary patch literal 1143 zcmV--1c>{IP)^@RA_e&Zo>zJtd;qJac#m6z+Q1}$=W>DCUG6j zp18H(1Cr>P(LH=X-~-?XtTyLXuD6Gt>48`ja;hkXo_?MC>f7Bs!MFZ%Yyh5a0tsx1 ztRc2U)(sm&b&rvHZmQ?kYQlE_ zzLHEMLc38!5=COp35-~N&Ve;DN;@P~`(95xc?=>oO3IS3W;Ugn6q$v*YjDD%t&XZQ z@>&H@mWZD0sUo4x%$4`Nmif4$8SYR(13tG{dm5t+lq8a>0dDCNi_EMnCM14F0y=uR z{@%rqC`;t68sLy-cDV!zL7(k9TvQzwKzA0+^~ar0%`VN5WNK(BhcQ+}cEuX-Niq zV}2J!mAtjZMZPQMQj3tPFn`T4rZnYbL7P7aX+%qK$nTeiSRN!8*aZ@dPA6XJ1GI2t zEb+m-{-TM@`7KU<=hc2d%LIcL0QPB~LMCMILPo|HBB3@xA{sU_g(8(ma;z4}iHS}@ z=@Qnbf^Gi0J-c(_A5{l_FrY%C+?jl3sR|{xp%7PjxT1PTUNUtXcoLm}M zOB~@>G_AU78wwH*k~PS_zpexkY#Y)D%tBb>Z!w#$SKCLQ8Nfve5^mCxWy`o)^Fyyi z1tMUYF;gKmEikcI=wKk}k7V9ij`K$mnJDw=P%Ay9mGc6}FN>}+-z$#WR%SIQ>ZeTj z73u77z?s_k$PRBAGEPA6`D{;Az@Sl>WtSn6ac2mo7fqHOu}sKxyp~}|P9_tUo#Bj{ zmXQA;*h>TvFukzm)Hh^~NvOzglz0wLPmecluxu&-}^Bqja6=S?J>|T zS8EB6`f6cM5z9EiA<0X9tI;uoNif{5f`|-$Y0h>B49#T^Biht}zDLn!7KLT**{wMU zrj+mXvdynX@jLyr+1o_KB=pIBY#(#Y`pIB!p&mnYgSRGHI7sV`%^RkQ-VexuGSJ8(Jb+ a0l+VhIIU?koc!_t0000j+g%K0-$q5VmyLme|C<>aX9CGuUxWqTq z_|UNw7csR*$K@OtAMif7Y`Cc4`;|LBW{ew^cDr5t);Yz}HAFebqlLF~%Zll@tQ)#d zrYM#D%nk0@YiKydgU8)`+4_}ihRZx|?)Vq!a`arA%Z&*f(n5)czke@zdahk@RydcF z_3v9QmmdASm@$-sF S4N5@&GkCiCxvXHWG-wgfZ8CPs zy4e=MJFhL%+ANc?4%mjZTqU`J#Ns~T)Z6E?akB^d|AhBz=Ji=NInY*Vxq?KZ(^+oH zeP&vRSC*ThVy3NgZB>%itYtrL_ag0^?()LtR7}NS-cswsci6v`QpER=L1LX=#j+8GmbBH~j@BVp$uIm=#Ktlm^I( zkwnnn=f4EoViETR>pHm=6ysVGzTLKfId-gIwa|#fL-~AU$W9Lk6(6z8j_#Bcawp7*|6mT?8^lZ zdnER`KqK}^_e~D~2LMHk#V|9rLu^;3%9l{^bVB_ce~%sZK5y=hVF$Fo3lK1XWT*io zHw_>i^$Gwh0Jz8WTWq&KZ!y0pHOMJm*La3nIqCp(bV=IscJ4=u*MhBJ?Z1~t9 zbSbS^tQOf34IdkXP7yxZYmpt%@CPCiCc49IEPF1l4X$ctThktg=OXJ{CnAE1{X}g3 z0EtvjA;tZV= z!UvL$D*|bj2U49UYqmHU-pp3vx%{YEqABxhYWeXkIe{^TYpZq5d7Ll5Xi9up_y1Uh zv)k&+T^sisOuuyS-h|Cp>z@9|_xZ@1cqhU)Ec7DZMBSzht^(C(&xM^`EScD?kOQ=S zch_sn2;J;iyIx#5b0VR-S6Z4WN*Uy?yAEHt*`rxN%3d-vJzy^GGgaY}H9ZIPK7*&L KpUXO@geCx$<$hrR literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/faculties/Letteren_Wijsbegeerte.png b/frontend/src/assets/img/faculties/Letteren_Wijsbegeerte.png new file mode 100644 index 0000000000000000000000000000000000000000..0e47d40df5d3790e7f2cc2ddfb1f682423bbefae GIT binary patch literal 486 zcmV@P)OnOjR1WEX}NhI{^FC{t3W|q7O3>4@|A#JK66o-+N~?zgkr!39AW3HBuw3 zv07rADIOVZXa${R38P(+H>TK0Iif+jBF9XL1gVjrdxHd@`$*8$^SQGJMQY@RDgV@n z^^eV8lMWwZBN>Se*JM8eu*cM9o@<`Y6#Yz@QbXHCkEBQpfwd4FO=wwXz!4LY7u56$ zz+-PCuh3?sOG)xY1JCJj?}Ls^*I7$Ev=S2XL8Bi5BD2yxF|TqWe}NsmaYUkzRj6r@@!Hj5IBxc~qF07*qoM6N<$g2VyFF8}}l literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/faculties/Politieke_Sociale_Wetenschappen.png b/frontend/src/assets/img/faculties/Politieke_Sociale_Wetenschappen.png new file mode 100644 index 0000000000000000000000000000000000000000..adad8eb864ec40351836b74ffd36a43d3d567837 GIT binary patch literal 975 zcmV;=12FuFP)+Hh><0H1o;XBc<+kNK*`v4FL5R zVP}9gb#E+6B%vUOUCw&|UI3_Nb}x<^W$$@9>!FAU5s@V(0J;Dg6!;LpdS>_HSf}ii zy1LZua4S!Gh{!7E0q2(a?0^>BTQGl8%5bs{%(`?*_iE-%gP72A7;;|YJOVJLG94tz zyd6ej4B^I@vaK%Z&Xpe`vg`@dv#iwMJTZHUU}!=|2OW62eBDzKTSvy6o8GfRY911T zZ}C~Wa#5y&m}~J6Vu|Rg{pmd`44RoY;?eYE&C->NSR!(};#oJyFV6J^l3jI5vLxHj zom_;7$Vw8{=bX|~?w&se&{-haJEl(6Ox{VCe+f)Qh={I23Ae&pOvD=i_NlN)JxTeF zd-uAz&V_;5XU{SfAtJKMGL;M|@Qe8j?1>HmeDDr43oY(F^m@2HWsj(C-H~Fwb$({rK2qlQnCf2S*Z3o2)eb$BGHKUBc zhwhkg+n#du4mfuB+%{dVzi*Qsv?M0HSfc7v(f^OA?G~9gCVn?O zD+?=}e|YQi-aemQIBm^C0uk4*k0BL^%of9BlLt~^)b|wIgXufWfT5>D`W`Jz0&{po zNT}SuiS|RSgh5I#+L|(=Q3|&^MLi-6nS?Hso^x%TvbXpgyV_YCHZn5sSRTtz=eC x5!H{_WkW@zY^aEo4Hc2Hp(0W?oDU)Z{sIfz-@276&}jew002ovPDHLkV1j9xxaR-> literal 0 HcmV?d00001 diff --git a/frontend/src/assets/img/faculties/Recht_Criminologie.png b/frontend/src/assets/img/faculties/Recht_Criminologie.png new file mode 100644 index 0000000000000000000000000000000000000000..197b479a92332e311caf14a5e5a7307f72de2dbb GIT binary patch literal 721 zcmV;?0xtcDP)rNkawX0;WbvOA+@74gfu&2Sm*~ zz>8jwF8~L?7vKcW0Z2=MjAq4Xzh=GbfaT|3wT$<}fA7rf*kR}6bpHT7V7Ct&ZvsVp~Kiztnr zEiq)Rt}z6AAQh!sSYoDCenLp=XNHYbA^!|Z8fU*DBnOZg)--ZDgML)VYzybY%&-KK zBIMSv{35YJ&H;?63~6guYBxOw@D5;QTos5BlCk=!_URL&M;s3TCN#2fITLdr=Bz!@ z{*EPQBJ?%3B4i3+q1n!jUd_?xSkPKq6LQ7c>cl=uOv4$?!ROT15@{l&4(>U%3kt|h z%%U1UYm7oOSf~*7OEOMEgs27Ap2}3&Lj#m24&R(>*58XHBx70S zuW|L8lDS-nPpdwq#Z@_K%}hG0Bq7S@H_UxpsH`KEExa6&io=3sMQ{8`MdOH`*t3>Z zY}9>TXpHZ@LcPaqSjKblPO&m)u4ttR6s{lB%<`*B5n((j#P% zP-HrV{5K!y4h>5>(Vu*LNJ3&=V8aSaotcz@JUGuBNl0#aBMf0F2)Q?`GKEiw6eHIG z2cgc=6X>98OT+4?pnGvL{0m3d7=(0hV(#c92ax} zdXtVKzJM5NH1y5^q8uQ(0JFoll=o`T=0Q!)DS>65@iEyEfjvLy#kJ{*gy%v!$?E!Q*k85D2u^ zl*bM2F|XNdZQOAS)(QjyB9e=h*Q>1~bmf46#b(Ln3nF*sg86d5zfX;;@2W6H63W+F zV;-+~l;!i6adn3ZEx(t>$Zd)JuRxv}BQ5n%P34;-I#G3A$S6D)Es9Gy_nRjA+#v7% z$u}ahH_8d3^JQjS-JyIVQnIZWasMb8g|`Ho-xHOJE8Rq1#Uo^AFSzpeo?P5oBm@yAzxmGrN7t>Itc!rqO?4ecG zY?6rxNqKF2F2(%#pj9!^=Ui#M>*p3YsSN>=^k^wSw9dtM_o;x$X}L>Iy1d7FK}rdt zwN3dmPgA7=8C$&HR6*sot`s18R}KZ)uwq3i_9xR=2(S#Vj8RX;Mnom-D`RvI8lLL* iO#?{ZG=TI<0R8~J3AZiLbPUh{0000 { variant="outlined"> diff --git a/frontend/src/components/RoleSelector.vue b/frontend/src/components/RoleSelector.vue index bc2bea57..9d48294c 100644 --- a/frontend/src/components/RoleSelector.vue +++ b/frontend/src/components/RoleSelector.vue @@ -10,16 +10,26 @@ const { view, user } = storeToRefs(useAuthStore());