Index: backend/auth_form/apps.py
===================================================================
--- backend/auth_form/apps.py	(revision 03b54d263f511b328f6b837e4d2fef641a880974)
+++ backend/auth_form/apps.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -5,2 +5,5 @@
     default_auto_field = 'django.db.models.BigAutoField'
     name = 'auth_form'
+
+    def ready(self):
+        import auth_form.signals
Index: backend/auth_form/migrations/0002_alter_user_managers_remove_student_enrolled_subjects_and_more.py
===================================================================
--- backend/auth_form/migrations/0002_alter_user_managers_remove_student_enrolled_subjects_and_more.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
+++ backend/auth_form/migrations/0002_alter_user_managers_remove_student_enrolled_subjects_and_more.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -0,0 +1,27 @@
+# Generated by Django 5.1.7 on 2025-05-03 17:55
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('auth_form', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AlterModelManagers(
+            name='user',
+            managers=[
+            ],
+        ),
+        migrations.RemoveField(
+            model_name='student',
+            name='enrolled_subjects',
+        ),
+        migrations.AddField(
+            model_name='student',
+            name='has_filled_form',
+            field=models.BooleanField(default=False),
+        ),
+    ]
Index: backend/auth_form/migrations/0003_alter_student_current_year_and_more.py
===================================================================
--- backend/auth_form/migrations/0003_alter_student_current_year_and_more.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
+++ backend/auth_form/migrations/0003_alter_student_current_year_and_more.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -0,0 +1,60 @@
+# Generated by Django 5.1.7 on 2025-05-03 18:53
+
+import django.contrib.postgres.fields
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('auth_form', '0002_alter_user_managers_remove_student_enrolled_subjects_and_more'),
+        ('subjects', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='student',
+            name='current_year',
+            field=models.PositiveIntegerField(null=True),
+        ),
+        migrations.AlterField(
+            model_name='student',
+            name='favorite_professors',
+            field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=16), blank=True, null=True, size=None),
+        ),
+        migrations.AlterField(
+            model_name='student',
+            name='index',
+            field=models.CharField(blank=True, max_length=20, null=True, unique=True),
+        ),
+        migrations.AlterField(
+            model_name='student',
+            name='passed_subjects',
+            field=models.ManyToManyField(blank=True, related_name='passed_subjects', to='subjects.subject'),
+        ),
+        migrations.AlterField(
+            model_name='student',
+            name='preferred_domains',
+            field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, null=True, size=None),
+        ),
+        migrations.AlterField(
+            model_name='student',
+            name='preferred_evaluation',
+            field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=16), blank=True, null=True, size=None),
+        ),
+        migrations.AlterField(
+            model_name='student',
+            name='preferred_technologies',
+            field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, null=True, size=None),
+        ),
+        migrations.AlterField(
+            model_name='student',
+            name='study_effort',
+            field=models.PositiveIntegerField(help_text='Hours per week', null=True),
+        ),
+        migrations.AlterField(
+            model_name='student',
+            name='study_track',
+            field=models.CharField(blank=True, choices=[('SIIS23', 'SIIS'), ('SEIS23', 'SEIS'), ('KI23', 'KI'), ('KN23', 'KN'), ('IMB23', 'IMB'), ('PIT23', 'PIT')], max_length=20, null=True),
+        ),
+    ]
Index: backend/auth_form/migrations/0004_alter_student_user.py
===================================================================
--- backend/auth_form/migrations/0004_alter_student_user.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
+++ backend/auth_form/migrations/0004_alter_student_user.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -0,0 +1,20 @@
+# Generated by Django 5.1.7 on 2025-05-03 19:06
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('auth_form', '0003_alter_student_current_year_and_more'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='student',
+            name='user',
+            field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='student', to=settings.AUTH_USER_MODEL),
+        ),
+    ]
Index: backend/auth_form/models.py
===================================================================
--- backend/auth_form/models.py	(revision 03b54d263f511b328f6b837e4d2fef641a880974)
+++ backend/auth_form/models.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -43,6 +43,6 @@
 
 class Student(models.Model):
-    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='student_profile')
-    index = models.CharField(max_length=20, unique=True)
+    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='student')
+    index = models.CharField(max_length=20, unique=True, null=True, blank=True)
 
     STUDY_TRACK_CHOICES = [
@@ -54,16 +54,15 @@
         ('PIT23', 'PIT'),
     ]
-    study_track = models.CharField(max_length=20, choices=STUDY_TRACK_CHOICES)
+    study_track = models.CharField(max_length=20, choices=STUDY_TRACK_CHOICES, null=True, blank=True)
+    has_filled_form = models.BooleanField(default=False)
+    
+    current_year = models.PositiveIntegerField(null=True)
+    study_effort = models.PositiveIntegerField(help_text="Hours per week", null=True)
+    preferred_domains = ArrayField(models.CharField(max_length=64), null=True, blank=True)
+    preferred_technologies = ArrayField(models.CharField(max_length=64), null=True, blank=True)
+    preferred_evaluation = ArrayField(models.CharField(max_length=16), null=True, blank=True)
+    favorite_professors = ArrayField(models.CharField(max_length=16), null=True, blank=True)
 
-    current_year = models.PositiveIntegerField()
-    study_effort = models.PositiveIntegerField(help_text="Hours per week")
-    preferred_domains = ArrayField(models.CharField(max_length=64))
-    preferred_technologies = ArrayField(models.CharField(max_length=64))
-    preferred_evaluation = ArrayField(models.CharField(max_length=16))
-    favorite_professors = ArrayField(models.CharField(max_length=16))
-
-    
-    passed_subjects = models.ManyToManyField('subjects.subject', related_name="passed_subjects")
-    enrolled_subjects = models.ManyToManyField('subjects.subject', related_name="enrolled_subjects")
+    passed_subjects = models.ManyToManyField('subjects.subject', related_name="passed_subjects", blank=True)
 
     
@@ -79,4 +78,13 @@
     def get_user_info(self):
         return self
+    
+    def get_subjects_info(self):
+        return [
+            {
+                'subject_name': subject.name,
+                'subject_info': subject.subject_info._dict__,
+            }
+            for subject in self.passed_subjects.all()
+        ]
 
 
Index: backend/auth_form/permissions.py
===================================================================
--- backend/auth_form/permissions.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
+++ backend/auth_form/permissions.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -0,0 +1,13 @@
+from rest_framework.permissions import BasePermission
+
+class IsStudent(BasePermission):
+    def has_permssion(self, request, view):
+        return hasattr(request.user, 'student')
+    
+class CanSubmitForm(BasePermission):
+    def has_permission(self, request, view):
+        return hasattr(request.user, 'student') and not request.user.student.has_filled_form
+
+class CanUpdateForm(BasePermission):
+    def has_permission(self, request, view):
+        return hasattr(request.user, 'student') and request.user.student.has_filled_form
Index: backend/auth_form/serializers.py
===================================================================
--- backend/auth_form/serializers.py	(revision 03b54d263f511b328f6b837e4d2fef641a880974)
+++ backend/auth_form/serializers.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -5,4 +5,7 @@
 from rest_framework.exceptions import AuthenticationFailed
 from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
+from .models import Student
+from subjects.models import Subject
+from subjects.serializers import SubjectSerializer
 
 User = get_user_model()
@@ -64,2 +67,14 @@
         else:
             serializers.ValidationError('Must include "email" and "password"')
+
+class StudentFormSerializer(serializers.ModelSerializer):
+    passed_subjects = serializers.PrimaryKeyRelatedField(queryset=Subject.objects.all(), many=True)
+
+    class Meta:
+        model = Student
+        exclude = ['user', 'has_filled_form']
+    
+    def to_representation(self, instance):
+        rep = super().to_representation(instance)
+        rep['passed_subjects'] = SubjectSerializer(instance.passed_subjects.all(), many=True).data
+        return rep
Index: backend/auth_form/signals.py
===================================================================
--- backend/auth_form/signals.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
+++ backend/auth_form/signals.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -0,0 +1,13 @@
+from django.db.models.signals import post_save
+from django.dispatch import receiver
+from .models import User, Student
+
+@receiver(post_save, sender=User)
+def create_student_profile(sender, instance, created, **kwargs):
+    if created and instance.user_type == 'student': 
+        Student.objects.create(user=instance)
+
+@receiver(post_save, sender=User)
+def save_student_profile(sender, instance, **kwargs):
+    instance.student_profile.save()
+    
Index: backend/auth_form/urls.py
===================================================================
--- backend/auth_form/urls.py	(revision 03b54d263f511b328f6b837e4d2fef641a880974)
+++ backend/auth_form/urls.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -1,4 +1,4 @@
 from django.urls import path
-from .views import RegisterView, LoginView
+from .views import RegisterView, LoginView, StudentFormView
 from rest_framework_simplejwt.views import TokenObtainPairView
 from .serializers import CustomTokenObtainPairSerializer
@@ -6,4 +6,5 @@
 urlpatterns = [
     path('register/', RegisterView.as_view(), name='register'),
-    path('login/', TokenObtainPairView.as_view(serializer_class=CustomTokenObtainPairSerializer), name='token_obtain_pair')
+    path('login/', TokenObtainPairView.as_view(serializer_class=CustomTokenObtainPairSerializer), name='token_obtain_pair'),
+    path('form/', StudentFormView.as_view(), name="student_form")
 ]
Index: backend/auth_form/views.py
===================================================================
--- backend/auth_form/views.py	(revision 03b54d263f511b328f6b837e4d2fef641a880974)
+++ backend/auth_form/views.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -1,7 +1,10 @@
-from .serializers import RegistrationSerializer, LoginSerializer
+from .serializers import RegistrationSerializer, LoginSerializer, StudentFormSerializer
 from rest_framework import serializers, status, views
 from rest_framework.views import APIView
 from rest_framework.response import Response
+from rest_framework.permissions import IsAuthenticated
+from rest_framework.decorators import api_view, permission_classes
 from rest_framework_simplejwt.tokens import RefreshToken
+from .permissions import IsStudent, CanSubmitForm, CanUpdateForm
 
 # Create your views here.
@@ -27,5 +30,4 @@
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
 
-
 class LoginView(APIView):
     def post(self, request):
@@ -43,3 +45,37 @@
         }, status=status.HTTP_200_OK)
 
+class StudentFormView(APIView):
+    def get_permissions(self):
+        if self.request.method=='POST':
+            return [IsAuthenticated(), CanSubmitForm(), IsStudent()]
+        elif self.request.method == 'PUT':
+            return [IsAuthenticated(), IsStudent(), CanUpdateForm()]
+        return [IsAuthenticated(), IsStudent()]
+    
+    def get(self, request):
+        print(request.user)
+        student = request.user.student
+        serializer = StudentFormSerializer(student)
+        return Response(serializer.data)
+    
+    def post(self, request):
+        serializer = StudentFormSerializer(instance=request.user.student, data=request.data)
+        if serializer.is_valid():
+            serializer.save()
+            request.user.student.has_filled_form = True
+            request.user.student.save()
+            return Response(serializer.data, status=status.HTTP_201_CREATED)
+        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
+    
+    def put(self, request):
+        serializer = StudentFormSerializer(instance=request.user.student, data=request.data)
+        if serializer.is_valid():
+            serializer.save()
+            return Response(serializer.data, status=status.HTTP_200_OK)
+        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
+    
 
+
+
+
+
Index: backend/subjects/serializers.py
===================================================================
--- backend/subjects/serializers.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
+++ backend/subjects/serializers.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -0,0 +1,27 @@
+from rest_framework import serializers
+from .models import Subject, Subject_Info
+
+class SubjectInfoSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Subject_Info
+        fields = [
+            'level',
+            'short',
+            'prerequisite',
+            'activated',
+            'participants',
+            'mandatory',
+            'mandatory_for',
+            'semester',
+            'season',
+            'elective_for',
+            'professors',
+            'assistants'
+        ]
+class SubjectSerializer(serializers.ModelSerializer):
+    subject_info = SubjectInfoSerializer()
+    class Meta:
+        model = Subject
+        fields = [
+            'id', 'name', 'code', 'abstract', 'subject_info'
+        ]
Index: backend/subjects/views.py
===================================================================
--- backend/subjects/views.py	(revision 03b54d263f511b328f6b837e4d2fef641a880974)
+++ backend/subjects/views.py	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -3,4 +3,7 @@
 from django.shortcuts import render
 from django.db import connection
+from rest_framework.decorators import api_view
+from rest_framework.response import Response
+from .serializers import SubjectSerializer
 from .models import Subject_Info, Subject
 
@@ -9,33 +12,7 @@
     return HttpResponse("ok")
 
-
+@api_view(['GET'])
 def all_subjects(request):
-    all_subjects = Subject.objects.select_related('subject_info').filter(subject_info__isnull=False).order_by('id')
-
-    result = []
-    for subject in all_subjects:
-        subject_info = subject.subject_info
-
-        subject_data = {
-            "id": subject.id,
-            "name": subject.name,
-            "code": subject.code,
-            "abstract": subject.abstract,
-            "info": {
-                "level": subject_info.level,
-                "short": subject_info.short,
-                "prerequisite": subject_info.prerequisite,
-                "activated": subject_info.activated,
-                "participants": subject_info.participants,
-                "mandatory": subject_info.mandatory,
-                "mandatory_for": subject_info.mandatory_for,
-                "semester": subject_info.semester,
-                "season": subject_info.season,
-                "elective_for": subject_info.elective_for,
-                "professors": subject_info.professors,
-                "assistants": subject_info.assistants,
-            }
-        }
-        result.append(subject_data)
-    
-    return JsonResponse({"subjects": result}, safe=False)
+    subjects = Subject.objects.select_related('subject_info').filter(subject_info__isnull=False).order_by('id')
+    serializer = SubjectSerializer(subjects, many=True)
+    return Response(serializer.data)
Index: frontend/src/pages/Form.tsx
===================================================================
--- frontend/src/pages/Form.tsx	(revision 03b54d263f511b328f6b837e4d2fef641a880974)
+++ frontend/src/pages/Form.tsx	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -1,8 +1,14 @@
-import React from 'react';
+import { useEffect } from 'react';
 
-const Form: React.FC = () => {
-    return (
-        <div>Form!</div>
-    )
+const Form = () => {
+        useEffect(() => {
+            const fetchData = async () => {
+              const response = await fetch("http://localhost:8000/subjects");
+              const data = await response.json();
+              console.log(data);
+              console.log(data.subjects);
+            };
+            fetchData();
+          }, []);
 }
 
Index: frontend/src/pages/Register.tsx
===================================================================
--- frontend/src/pages/Register.tsx	(revision 03b54d263f511b328f6b837e4d2fef641a880974)
+++ frontend/src/pages/Register.tsx	(revision bbf0348d3fbf0f64e13f14295673c88d32d60cd2)
@@ -105,5 +105,5 @@
         <PasswordInput
           name="confirmPassword"
-          value={formData.password}
+          value={formData.confirmPassword}
           onChange={handleChange}
         />
