diff --git a/account/views/profile.py b/account/views/profile.py index 5eda535..acee2fe 100644 --- a/account/views/profile.py +++ b/account/views/profile.py @@ -8,7 +8,7 @@ from account.serializers import ProfileSerializer, EducationSerializer, WorkExperienceSerializer, UserSerializer, \ PublicProfileSerializer -from practice.models import Track, Practice, Subdomain +from practice.models import Track, Practice, Subdomain, PracticeSolution from account.models import Profile, WorkExperience, Education from practice.serializers import TrackSerializer, PracticeSerializer, PracticeFilterSerializer @@ -67,7 +67,19 @@ class SinglePracticeView(APIView): def get(self, request, track_slug, practice_slug): practice = Practice.objects.get(slug=practice_slug) serializer = PracticeSerializer(practice) - return Response(serializer.data) + solved = PracticeSolution.objects.filter(practice=practice).filter(user=request.user).exists() + data = {'solved': solved} + data.update(serializer.data) + return Response(data) + + def post(self, request, track_slug, practice_slug): + practice = Practice.objects.get(slug=practice_slug) + user = request.user + solution = PracticeSolution.objects.get_or_create(user_id=user.id, practice_id=practice.id) + msg = { + 'message': 'Solution submitted successfully' + } + return Response(msg) class JobsView(APIView): diff --git a/practice/migrations/0002_auto_20201018_1229.py b/practice/migrations/0002_auto_20201018_1229.py new file mode 100644 index 0000000..b235b9c --- /dev/null +++ b/practice/migrations/0002_auto_20201018_1229.py @@ -0,0 +1,35 @@ +# Generated by Django 3.0.7 on 2020-10-18 12:29 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('practice', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='practice', + name='subdomain', + field=models.ManyToManyField(related_name='subdomain', to='practice.Subdomain'), + ), + migrations.CreateModel( + name='PracticeSolution', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('practice', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='practice.Practice')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.AddField( + model_name='practice', + name='solutions', + field=models.ManyToManyField(related_name='solutions', through='practice.PracticeSolution', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/practice/models.py b/practice/models.py index df7ffb9..de2ad44 100644 --- a/practice/models.py +++ b/practice/models.py @@ -35,12 +35,19 @@ class Practice(models.Model): body = RichTextField() difficulty = models.IntegerField() timestamp = models.DateTimeField(auto_now_add=True) - subdomain = models.ManyToManyField(Subdomain) + subdomain = models.ManyToManyField(Subdomain, related_name='subdomain') + solutions = models.ManyToManyField(User, through='PracticeSolution', related_name='solutions') def __str__(self): return self.title +class PracticeSolution(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + practice = models.ForeignKey(Practice, on_delete=models.CASCADE) + timestamp = models.DateTimeField(auto_now_add=True) + + def generate_slug_from_title(sender, instance, *args, **kwargs): if not instance.slug: instance.slug = unique_slug_generator(instance, for_=instance.title) diff --git a/practice/serializers.py b/practice/serializers.py index 2662c25..5e68597 100644 --- a/practice/serializers.py +++ b/practice/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from practice.models import Track, Practice +from practice.models import Track, Practice, PracticeSolution class TrackSerializer(serializers.ModelSerializer): @@ -12,10 +12,16 @@ class Meta: class PracticeSerializer(serializers.ModelSerializer): class Meta: model = Practice - fields = '__all__' + exclude = ('solutions', ) class PracticeFilterSerializer(serializers.Serializer): track = serializers.IntegerField() difficulty = serializers.ListField(child=serializers.IntegerField(), allow_empty=True, allow_null=True) - subdomain = serializers.ListField(child=serializers.IntegerField(), allow_empty=True, allow_null=True) \ No newline at end of file + subdomain = serializers.ListField(child=serializers.IntegerField(), allow_empty=True, allow_null=True) + + +class PracticeSolutionSerializer(serializers.ModelSerializer): + class Meta: + model = PracticeSolution + fields = '__all__'