From e8547edf0e1de5a7ca1f131d70fccb8b499a017a Mon Sep 17 00:00:00 2001 From: Rushil Umaretiya Date: Sun, 13 Dec 2020 06:45:52 -0500 Subject: [PATCH] fixed rest api for desktop app's purposes --- .../api/migrations/0003_auto_20201213_0246.py | 25 ++++++++ .../api/migrations/0004_auto_20201213_0331.py | 22 +++++++ site/api/models.py | 9 ++- site/api/serializers.py | 30 +++++++--- site/api/urls.py | 6 +- site/api/views.py | 57 ++++++++----------- site/config/settings.py | 8 +-- site/frontend/migrations/__init__.py | 0 8 files changed, 107 insertions(+), 50 deletions(-) create mode 100644 site/api/migrations/0003_auto_20201213_0246.py create mode 100644 site/api/migrations/0004_auto_20201213_0331.py delete mode 100644 site/frontend/migrations/__init__.py diff --git a/site/api/migrations/0003_auto_20201213_0246.py b/site/api/migrations/0003_auto_20201213_0246.py new file mode 100644 index 00000000..a8c7f8ee --- /dev/null +++ b/site/api/migrations/0003_auto_20201213_0246.py @@ -0,0 +1,25 @@ +# Generated by Django 3.1.4 on 2020-12-13 07:46 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0002_remove_profile_profile_pic'), + ] + + operations = [ + migrations.AddField( + model_name='classroom', + name='link', + field=models.CharField(default='https://meet.google.com/', max_length=100), + preserve_default=False, + ), + migrations.AlterField( + model_name='classroom', + name='student', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='classes', to='api.profile'), + ), + ] diff --git a/site/api/migrations/0004_auto_20201213_0331.py b/site/api/migrations/0004_auto_20201213_0331.py new file mode 100644 index 00000000..5f1fc717 --- /dev/null +++ b/site/api/migrations/0004_auto_20201213_0331.py @@ -0,0 +1,22 @@ +# Generated by Django 3.1.4 on 2020-12-13 08:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0003_auto_20201213_0246'), + ] + + operations = [ + migrations.AlterModelOptions( + name='classroom', + options={'ordering': ['period']}, + ), + migrations.AlterField( + model_name='classroom', + name='period', + field=models.PositiveIntegerField(blank=True), + ), + ] diff --git a/site/api/models.py b/site/api/models.py index 94cef275..1a712b20 100644 --- a/site/api/models.py +++ b/site/api/models.py @@ -22,10 +22,13 @@ class Profile(models.Model): class Classroom(models.Model): - student = models.ForeignKey(Profile, on_delete=models.CASCADE) + student = models.ForeignKey(Profile, related_name='classes', on_delete=models.CASCADE) name = models.CharField(max_length=30) teacher = models.CharField(max_length=30) - period = models.CharField(models.PositiveIntegerField, blank=True, unique=True, max_length=1) - + link = models.CharField(max_length=100) + period = models.PositiveIntegerField(blank=True) def __str__(self): return f"{self.student.user.username}'s Class: {self.name}" + + class Meta: + ordering = ['period'] diff --git a/site/api/serializers.py b/site/api/serializers.py index e687c5f6..b73d5fe0 100644 --- a/site/api/serializers.py +++ b/site/api/serializers.py @@ -7,16 +7,30 @@ from .models import * class UserSerializer(serializers.ModelSerializer): class Meta: model = User - fields = '__all__' - - -class ProfileSerializer(serializers.ModelSerializer): - class Meta: - model = Profile - fields = '__all__' + fields = ['id', 'username', 'first_name', 'last_name', 'email'] class ClassroomSerializer(serializers.ModelSerializer): class Meta: model = Classroom - fields = '__all__' \ No newline at end of file + fields = ['id', 'name', 'teacher', 'link', 'period'] + + +class ProfileSerializer(serializers.ModelSerializer): + user = UserSerializer(required=True) + classes = ClassroomSerializer(many=True) + + class Meta: + model = Profile + fields = ['id', 'user', 'classes'] + +class ProfileDetailSerializer(serializers.ModelSerializer): + class Meta: + model = Profile + fields = ['id', 'user'] + +class ClassroomDetailSerializer(serializers.ModelSerializer): + student = ProfileDetailSerializer() + class Meta: + model = Classroom + fields = ['id', 'name', 'teacher', 'link', 'period', 'student'] diff --git a/site/api/urls.py b/site/api/urls.py index 641c457b..790a3417 100644 --- a/site/api/urls.py +++ b/site/api/urls.py @@ -19,6 +19,8 @@ from .views import * urlpatterns = [ path('ping/', PingView.as_view()), - path('', GetProfile.as_view()), - path('auth/create/user/', CreateUser.as_view()), + path('user/', UserView.as_view()), + path('profile/', ProfileView.as_view()), + path('classes/', ClassroomView.as_view()), + path('classes/', ClassroomDetail.as_view()) ] diff --git a/site/api/views.py b/site/api/views.py index 79546a5a..7ec44487 100644 --- a/site/api/views.py +++ b/site/api/views.py @@ -10,6 +10,7 @@ from rest_framework.response import Response from rest_framework.views import APIView from .serializers import * +from .models import Profile # Create your views here. @@ -34,43 +35,33 @@ def retry_on_exception(view, num_retries=3, on_failure=HttpResponse(status=500), class PingView(View): - def get(self, request, *args, **kwargs): - return HttpResponse("python/django", status=200) + return HttpResponse("pong!", status=200) -class GetProfile(APIView): - serializer_class = ProfileSerializer - lookup_url_kwarg = 'id' +class UserView(APIView): + def get(self, request, format=None): + serializer = UserSerializer(request.user) + return Response(serializer.data) - def get(self, request): - pk = request.GET.get(self.lookup_url_kwarg) +class ProfileView(APIView): + def get(self, request, format=None): + profile = Profile.objects.get(user=request.user) + serializer = ProfileSerializer(profile) + return Response(serializer.data) - if pk: - profile = User.objects.filter(id=pk) - if profile.exists(): - user_profile = Profile.objects.get(user=profile[0]) - data = self.serializer_class(user_profile).data - return Response(data, status=status.HTTP_200_OK) - return Response({'Profile Not Found': 'Invalid Profile id.'}, status=status.HTTP_404_NOT_FOUND) - return Response({'Bad Request': 'id parameter not found in request'}, status=status.HTTP_400_BAD_REQUEST) +class ClassroomView(APIView): + def get(self, request, format=None): + classes = Profile.objects.get(user=request.user).classes + serializer = ClassroomSerializer(classes, many=True) + return Response(serializer.data) - -class CreateUser(APIView): - serializer_class = UserSerializer - - def post(self, request, format=None): - username = request.data.get('username') - email = request.data.get('email') - queryset1 = User.objects.filter(username=username) - queryset2 = User.objects.filter(email=email) - if queryset1.exists() or queryset2.exists(): - pass +class ClassroomDetail(APIView): + def get(self, request, *args, **kwargs): + class_id = self.kwargs.get('class_id', None) + classroom = Classroom.objects.get(id=class_id) + if request.user == classroom.student.user: + serializer = ClassroomDetailSerializer(classroom) + return Response(serializer.data) else: - user = User(email=email, username=username, password=request.data.get('password')) - user.save() - profile = Profile(user=user) - profile.save() - return Response(self.serializer_class(user).data, status=status.HTTP_201_CREATED) - - return Response({'Bad Request': 'Invalid data'}, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file + return Response(status=status.HTTP_403_FORBIDDEN) \ No newline at end of file diff --git a/site/config/settings.py b/site/config/settings.py index 89a25452..cfdaa7a3 100644 --- a/site/config/settings.py +++ b/site/config/settings.py @@ -46,12 +46,12 @@ INSTALLED_APPS = [ REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework.authentication.TokenAuthentication', + 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', ), - # 'DEFAULT_PERMISSION_CLASSES': ( - # 'rest_framework.permissions.IsAuthenticated', - # ), + 'DEFAULT_PERMISSION_CLASSES': ( + 'rest_framework.permissions.IsAuthenticated', + ), } MIDDLEWARE = [ diff --git a/site/frontend/migrations/__init__.py b/site/frontend/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000