This commit is contained in:
rangopits5 2025-01-15 14:59:23 +00:00
parent f038e97354
commit 4855f8f66c
21 changed files with 199 additions and 158 deletions

3
.gitignore vendored
View file

@ -277,3 +277,6 @@ lms/media/
.pytest_cache/ .pytest_cache/
.ipython/ .ipython/
.env .env
# Ignore Django migrations
*/migrations/

53
.idx/dev.nix Normal file
View file

@ -0,0 +1,53 @@
{ pkgs, ... }: {
# Which nixpkgs channel to use.
channel = "stable-24.05"; # or "unstable"
# Use https://search.nixos.org/packages to find packages
packages = [
pkgs.docker
pkgs.docker-compose
];
# Sets environment variables in the workspace
env = {};
services.docker.enable = true;
idx = {
# Search for the extensions you want on https://open-vsx.org/ and use "publisher.id"
extensions = [
"ms-azuretools.vscode-docker"
];
workspace = {
# Runs when a workspace is first created with this `dev.nix` file
onCreate = {
setup-docker-compose = ''
# Ensure Docker Compose is built only once
docker-compose -f docker-compose.local.yml build
'';
# Open editors for the following files by default, if they exist:
default.openFiles = ["docker-compose.local.yml"];
};
# To run something each time the workspace is (re)started, use the `onStart` hook
onStart = {
start-docker-compose = ''
docker-compose -f docker-compose.local.yml up
'';
};
};
# Enable previews and customize configuration
previews = {
enable = true;
previews = {
web = {
command = ["docker-compose" "-f" "docker-compose.local.yml" "up"];
env = {
PORT = "$PORT";
};
manager = "web";
};
};
};
};
}

4
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,4 @@
{
"IDX.aI.enableInlineCompletion": true,
"IDX.aI.enableCodebaseIndexing": true
}

View file

@ -14,11 +14,12 @@ SECRET_KEY = env(
default="DM837WrWz7KIfZM2eb4swzqGlIG0VhhAIFNXf9KgamMtT42DTkHIEXfpF4N9rh2Y", default="DM837WrWz7KIfZM2eb4swzqGlIG0VhhAIFNXf9KgamMtT42DTkHIEXfpF4N9rh2Y",
) )
# https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts # https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts
ALLOWED_HOSTS = ["127.0.0.1", "localhost"] # حدد المضيفين المسموح بهم ALLOWED_HOSTS = ["127.0.0.1", "localhost", "8000-idx-lms-1736949042591.cluster-qtqwjj3wgzff6uxtk26wj7fzq6.cloudworkstations.dev"] # حدد المضيفين المسموح بهم
CSRF_TRUSTED_ORIGINS = [ CSRF_TRUSTED_ORIGINS = [
'http://localhost:3000', 'http://localhost:3000',
'http://127.0.0.1:3000', 'http://127.0.0.1:3000',
'https://8000-idx-lms-1736949042591.cluster-qtqwjj3wgzff6uxtk26wj7fzq6.cloudworkstations.dev'
] ]
CORS_ORIGIN_ALLOW_ALL = True CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = False CORS_ALLOW_CREDENTIALS = False

View file

@ -1,4 +1,4 @@
# Generated by Django 5.0.10 on 2025-01-11 07:54 # Generated by Django 5.0.10 on 2025-01-15 14:43
import django.db.models.deletion import django.db.models.deletion
import uuid import uuid
@ -21,9 +21,13 @@ class Migration(migrations.Migration):
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('title', models.CharField(max_length=255, verbose_name='Course Title')), ('title', models.CharField(max_length=255, verbose_name='Course Title')),
('description', models.TextField(verbose_name='Course Description')), ('description', models.TextField(verbose_name='Course Description')),
('image', models.ImageField(null=True, upload_to='courses/image')),
('is_paid', models.BooleanField(default=False)),
('price', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)),
('rating', models.PositiveSmallIntegerField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
('instructor', 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='courses_taught', to=settings.AUTH_USER_MODEL, verbose_name='Instructor')),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
@ -51,9 +55,9 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('title', models.CharField(max_length=255, verbose_name='Module Title')), ('title', models.CharField(max_length=255, verbose_name='Module Title')),
('description', models.TextField(verbose_name='Module Description')), ('description', models.TextField(null=True, verbose_name='Module Description')),
('order', models.PositiveIntegerField(default=0, unique=True, verbose_name='Order')),
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modules', to='app.course', verbose_name='Course')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modules', to='app.course', verbose_name='Course')),
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
@ -61,9 +65,10 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('title', models.CharField(max_length=255, verbose_name='Lesson Title')), ('title', models.CharField(max_length=255, verbose_name='Lesson Title')),
('description', models.TextField(null=True, verbose_name='Lesson Description')),
('content', models.TextField(verbose_name='Lesson Content')), ('content', models.TextField(verbose_name='Lesson Content')),
('order', models.PositiveIntegerField(default=0, verbose_name='Order')),
('file', models.FileField(blank=True, null=True, upload_to='lesson_files/', verbose_name='Attached File')), ('file', models.FileField(blank=True, null=True, upload_to='lesson_files/', verbose_name='Attached File')),
('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')), ('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lessons', to='app.module', verbose_name='Module')),
], ],
), ),

View file

@ -1,4 +1,4 @@
# Generated by Django 5.0.10 on 2025-01-12 10:03 # Generated by Django 5.0.10 on 2025-01-15 14:47
from django.db import migrations, models from django.db import migrations, models
@ -11,8 +11,8 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='course', model_name='module',
name='image', name='order',
field=models.ImageField(null=True, upload_to='courses/image'), field=models.IntegerField(blank=True, null=True),
), ),
] ]

View file

@ -1,23 +0,0 @@
# Generated by Django 5.0.10 on 2025-01-12 10:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0002_course_image'),
]
operations = [
migrations.AddField(
model_name='course',
name='is_paid',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='course',
name='price',
field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True),
),
]

View file

@ -0,0 +1,17 @@
# Generated by Django 5.0.10 on 2025-01-15 14:48
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('app', '0002_module_order'),
]
operations = [
migrations.RemoveField(
model_name='module',
name='order',
),
]

View file

@ -1,18 +0,0 @@
# Generated by Django 5.0.10 on 2025-01-12 14:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0003_course_is_paid_course_price'),
]
operations = [
migrations.AddField(
model_name='course',
name='rating',
field=models.PositiveSmallIntegerField(blank=True, null=True),
),
]

View file

@ -0,0 +1,28 @@
# Generated by Django 5.0.10 on 2025-01-15 14:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0003_remove_module_order'),
]
operations = [
migrations.AddField(
model_name='enrollment',
name='order',
field=models.IntegerField(blank=True, null=True),
),
migrations.AddField(
model_name='lesson',
name='order',
field=models.IntegerField(blank=True, null=True),
),
migrations.AddField(
model_name='quiz',
name='order',
field=models.IntegerField(blank=True, null=True),
),
]

View file

@ -1,4 +1,4 @@
# Generated by Django 5.0.10 on 2025-01-14 17:20 # Generated by Django 5.0.10 on 2025-01-15 14:52
from django.db import migrations from django.db import migrations
@ -6,16 +6,20 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('app', '0009_lesson_description_alter_module_description'), ('app', '0004_enrollment_order_lesson_order_quiz_order'),
] ]
operations = [ operations = [
migrations.RemoveField(
model_name='enrollment',
name='order',
),
migrations.RemoveField( migrations.RemoveField(
model_name='lesson', model_name='lesson',
name='order', name='order',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='module', model_name='quiz',
name='order', name='order',
), ),
] ]

View file

@ -1,18 +0,0 @@
# Generated by Django 5.0.10 on 2025-01-14 08:17
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('app', '0004_course_rating'),
]
operations = [
migrations.RenameField(
model_name='course',
old_name='instructor',
new_name='owner',
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 5.0.10 on 2025-01-15 14:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0005_remove_enrollment_order_remove_lesson_order_and_more'),
]
operations = [
migrations.AddField(
model_name='enrollment',
name='order',
field=models.IntegerField(blank=True, null=True),
),
]

View file

@ -1,21 +0,0 @@
# Generated by Django 5.0.10 on 2025-01-14 11:08
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0005_rename_instructor_course_owner'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='module',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By'),
),
]

View file

@ -1,21 +0,0 @@
# Generated by Django 5.0.10 on 2025-01-14 11:10
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0006_module_created_by'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AlterField(
model_name='module',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Created By'),
),
]

View file

@ -0,0 +1,17 @@
# Generated by Django 5.0.10 on 2025-01-15 14:53
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('app', '0006_enrollment_order'),
]
operations = [
migrations.RemoveField(
model_name='enrollment',
name='order',
),
]

View file

@ -1,21 +0,0 @@
# Generated by Django 5.0.10 on 2025-01-14 12:12
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0007_alter_module_created_by'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='lesson',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Created By'),
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 5.0.10 on 2025-01-15 14:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0007_remove_enrollment_order'),
]
operations = [
migrations.AddField(
model_name='lesson',
name='order',
field=models.IntegerField(blank=True, null=True),
),
]

View file

@ -1,23 +0,0 @@
# Generated by Django 5.0.10 on 2025-01-14 13:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0008_lesson_created_by'),
]
operations = [
migrations.AddField(
model_name='lesson',
name='description',
field=models.TextField(null=True, verbose_name='Lesson Description'),
),
migrations.AlterField(
model_name='module',
name='description',
field=models.TextField(null=True, verbose_name='Module Description'),
),
]

View file

@ -0,0 +1,17 @@
# Generated by Django 5.0.10 on 2025-01-15 14:57
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('app', '0008_lesson_order'),
]
operations = [
migrations.RemoveField(
model_name='lesson',
name='order',
),
]

View file

@ -49,6 +49,7 @@ class Lesson(models.Model):
module = models.ForeignKey(Module, on_delete=models.CASCADE, related_name='lessons', verbose_name="Module") module = models.ForeignKey(Module, on_delete=models.CASCADE, related_name='lessons', verbose_name="Module")
file = models.FileField(upload_to='lesson_files/', null=True, blank=True, verbose_name="Attached File") file = models.FileField(upload_to='lesson_files/', null=True, blank=True, verbose_name="Attached File")
created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, verbose_name="Created By") created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, verbose_name="Created By")
#order = models.IntegerField(null=True, blank=True)
def str(self): def str(self):
return self.title return self.title