diff --git a/lms/accounts/migrations/0001_initial.py b/lms/accounts/migrations/0001_initial.py index 1e1fcc7..ed54a65 100644 --- a/lms/accounts/migrations/0001_initial.py +++ b/lms/accounts/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.10 on 2025-01-15 15:19 +# Generated by Django 5.0.10 on 2025-01-21 13:50 import django.utils.timezone from django.db import migrations, models diff --git a/lms/app/migrations/0001_initial.py b/lms/app/migrations/0001_initial.py index cf44e4e..ad11bec 100644 --- a/lms/app/migrations/0001_initial.py +++ b/lms/app/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.10 on 2025-01-15 15:19 +# Generated by Django 5.0.10 on 2025-01-21 13:50 import django.db.models.deletion import uuid @@ -15,6 +15,16 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='AD', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255)), + ('description', models.TextField()), + ('image', models.ImageField(blank=True, null=True, upload_to='ads_images/')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), migrations.CreateModel( name='Course', fields=[ @@ -27,7 +37,7 @@ class Migration(migrations.Migration): ('rating', models.PositiveSmallIntegerField(blank=True, null=True)), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='courses_taught', to=settings.AUTH_USER_MODEL, verbose_name='Instructor')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='owner', to=settings.AUTH_USER_MODEL, verbose_name='Owner')), ], ), migrations.CreateModel( @@ -47,7 +57,7 @@ class Migration(migrations.Migration): ('enrolled_at', models.DateTimeField(auto_now_add=True, verbose_name='Enrollment Date')), ('completed', models.BooleanField(default=False, verbose_name='Completed')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='enrollments', to='app.course', verbose_name='Course')), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='enrollments', to=settings.AUTH_USER_MODEL, verbose_name='Student')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='students_enrollments', to=settings.AUTH_USER_MODEL, verbose_name='Student')), ], ), migrations.CreateModel( @@ -68,17 +78,9 @@ class Migration(migrations.Migration): ('description', models.TextField(null=True, verbose_name='Lesson Description')), ('content', models.TextField(verbose_name='Lesson Content')), ('file', models.FileField(blank=True, null=True, upload_to='lesson_files/', verbose_name='Attached File')), + ('quiz', models.JSONField(null=True)), ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Created By')), ('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lessons', to='app.module', verbose_name='Module')), ], ), - migrations.CreateModel( - name='Quiz', - fields=[ - ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), - ('title', models.CharField(max_length=255, verbose_name='Quiz Title')), - ('questions', models.JSONField(null=True, verbose_name='Questions')), - ('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quiz', to='app.module', verbose_name='Module')), - ], - ), ] diff --git a/lms/app/migrations/0002_lesson_quiz_alter_enrollment_student_delete_quiz.py b/lms/app/migrations/0002_lesson_quiz_alter_enrollment_student_delete_quiz.py deleted file mode 100644 index 4909bbd..0000000 --- a/lms/app/migrations/0002_lesson_quiz_alter_enrollment_student_delete_quiz.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 5.0.10 on 2025-01-19 09:26 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.AddField( - model_name='lesson', - name='quiz', - field=models.JSONField(null=True), - ), - migrations.AlterField( - model_name='enrollment', - name='student', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='students_enrollments', to=settings.AUTH_USER_MODEL, verbose_name='Student'), - ), - migrations.DeleteModel( - name='Quiz', - ), - ] diff --git a/lms/app/migrations/0003_advertisement_alter_course_owner.py b/lms/app/migrations/0003_advertisement_alter_course_owner.py deleted file mode 100644 index da883d8..0000000 --- a/lms/app/migrations/0003_advertisement_alter_course_owner.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 5.0.10 on 2025-01-21 09:33 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0002_lesson_quiz_alter_enrollment_student_delete_quiz'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Advertisement', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255)), - ('description', models.TextField()), - ('image', models.ImageField(blank=True, null=True, upload_to='ads_images/')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ], - ), - migrations.AlterField( - model_name='course', - name='owner', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='owner', to=settings.AUTH_USER_MODEL, verbose_name='Owner'), - ), - ] diff --git a/lms/app/migrations/0004_rename_advertisement_ad.py b/lms/app/migrations/0004_rename_advertisement_ad.py deleted file mode 100644 index 6ed088f..0000000 --- a/lms/app/migrations/0004_rename_advertisement_ad.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.0.10 on 2025-01-21 10:43 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0003_advertisement_alter_course_owner'), - ] - - operations = [ - migrations.RenameModel( - old_name='Advertisement', - new_name='AD', - ), - ] diff --git a/lms/app/models.py b/lms/app/models.py index 9c72b7f..88bbc72 100644 --- a/lms/app/models.py +++ b/lms/app/models.py @@ -74,7 +74,6 @@ class Certificate(models.Model): - class AD(models.Model): title = models.CharField(max_length=255) description = models.TextField() diff --git a/lms/app/views.py b/lms/app/views.py index 5975227..2503f99 100644 --- a/lms/app/views.py +++ b/lms/app/views.py @@ -145,23 +145,20 @@ class LessonViewSet(ModelViewSet): """ Custom PATCH method to update a lesson. """ - # الحصول على معرف الكائن (lesson_id) من الـ URL + lesson_id = self.request.query_params.get('lesson_id') if not lesson_id: raise CustomValidationError({"detail": "Lesson ID is required in the URL."}, status=status.HTTP_400_BAD_REQUEST) - # البحث عن الدرس lesson = Lesson.objects.filter(id=lesson_id).first() if not lesson: raise CustomValidationError({"detail": "Lesson not found."}, status=status.HTTP_404_NOT_FOUND) - # التحقق من الصلاحيات (مالك الكورس أو مسجل فيه) is_owner = lesson.module.course.owner == request.user if not is_owner: raise PermissionDenied("You do not have permission to update this lesson.") - # تحديث الدرس باستخدام البيانات المرسلة في الطلب serializer = self.get_serializer(lesson, data=request.data, partial=True) # partial=True لتحديث الحقول المطلوبة فقط if serializer.is_valid(): serializer.save() @@ -185,7 +182,7 @@ class LessonViewSet(ModelViewSet): status=status.HTTP_400_BAD_REQUEST ) - # البحث عن الدرس + try: lesson = Lesson.objects.get(id=lesson_id) except Lesson.DoesNotExist: @@ -194,13 +191,11 @@ class LessonViewSet(ModelViewSet): status=status.HTTP_404_NOT_FOUND ) - # التحقق من الصلاحيات (مالك الكورس أو مسجل فيه) is_owner = lesson.module.course.owner == request.user if not is_owner: raise PermissionDenied("You do not have permission to delete this lesson.") - # حذف الدرس lesson.delete() return Response(