diff --git a/backend/api/migrations/0007_remove_file_points_file_downvotes_file_upvotes.py b/backend/api/migrations/0007_remove_file_points_file_downvotes_file_upvotes.py new file mode 100644 index 0000000..cb9e9e0 --- /dev/null +++ b/backend/api/migrations/0007_remove_file_points_file_downvotes_file_upvotes.py @@ -0,0 +1,32 @@ +# Generated by Django 4.2.11 on 2024-04-12 21:47 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("api", "0006_file_points_peeruser_points"), + ] + + operations = [ + migrations.RemoveField( + model_name="file", + name="points", + ), + migrations.AddField( + model_name="file", + name="downvotes", + field=models.ManyToManyField( + related_name="downvoted_file", to=settings.AUTH_USER_MODEL + ), + ), + migrations.AddField( + model_name="file", + name="upvotes", + field=models.ManyToManyField( + related_name="upvoted_file", to=settings.AUTH_USER_MODEL + ), + ), + ] diff --git a/backend/api/models.py b/backend/api/models.py index 5480732..95ce20c 100644 --- a/backend/api/models.py +++ b/backend/api/models.py @@ -58,7 +58,13 @@ class File(models.Model): Course, on_delete=models.SET_NULL, null=True, related_name="files" ) created_at = models.DateTimeField(auto_now_add=True) - points = models.IntegerField(default=0, blank=False) + upvotes = models.ManyToManyField(PeerUser, related_name="upvoted_file") + downvotes = models.ManyToManyField(PeerUser, related_name="downvoted_file") + + + @property + def points(self): + return self.upvotes.count() - self.downvotes.count() def __str__(self): return self.filename diff --git a/backend/api/views.py b/backend/api/views.py index 417bf3a..05c3f7d 100644 --- a/backend/api/views.py +++ b/backend/api/views.py @@ -112,15 +112,18 @@ class UpvoteFile(APIView): permission_classes = [IsAuthenticated] def post(self, request, file_id): + user = request.user update_user_ip(request) try: file = File.objects.get(id=file_id) - file.points += 1 + if file.downvotes.contains(user): + file.downvotes.remove(user) + file.upvotes.add(user) file.save() return Response( {"msg": f"Upvoted {file.filename}", "file_points": file.points}, - status=status.HTTP_200_OK, + status=status.HTTP_200_OK, ) except Exception as e: print(f"Error: {str(e)}") @@ -135,11 +138,14 @@ class DownvoteFile(APIView): permission_classes = [IsAuthenticated] def post(self, request, file_id): + user = request.user update_user_ip(request) try: file = File.objects.get(id=file_id) - file.points -= 1 + if file.upvotes.contains(user): + file.upvotes.remove(user) + file.downvotes.add(user) file.save() return Response( {"msg": f"Downvoted {file.filename}", "file_points": file.points},