Using sqlite3
Using sqlite3 for quick setup and running without installing postgresql
This commit is contained in:
parent
7642618c45
commit
c21814a282
@ -1,12 +1,3 @@
|
|||||||
# =============================
|
|
||||||
# Database config
|
|
||||||
|
|
||||||
DB_NAME=dj_lms
|
|
||||||
DB_USER=postgres
|
|
||||||
DB_PASSWORD=pass123
|
|
||||||
DB_HOST=localhost
|
|
||||||
DB_PORT=5432
|
|
||||||
|
|
||||||
# =============================
|
# =============================
|
||||||
# Email config
|
# Email config
|
||||||
|
|
||||||
|
|||||||
@ -49,7 +49,6 @@ If you would like to contribute, simply begin by implementing one from the list
|
|||||||
> The following programs are required to run the project
|
> The following programs are required to run the project
|
||||||
|
|
||||||
- [Python3.8+](https://www.python.org/downloads/)
|
- [Python3.8+](https://www.python.org/downloads/)
|
||||||
- [PostgreSQL database](https://www.postgresql.org/download/)
|
|
||||||
- [Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/)
|
- [Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/)
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-29 15:25
|
# Generated by Django 4.0.8 on 2024-08-31 11:51
|
||||||
|
|
||||||
import django.contrib.auth.models
|
import accounts.models
|
||||||
import django.contrib.auth.validators
|
import django.contrib.auth.validators
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.utils.timezone
|
import django.utils.timezone
|
||||||
@ -17,37 +17,64 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='User',
|
name='User',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('password', models.CharField(max_length=128, verbose_name='password')),
|
('password', models.CharField(max_length=128, verbose_name='password')),
|
||||||
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
|
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
|
||||||
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
|
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
|
||||||
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
|
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
|
||||||
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
|
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
|
||||||
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
|
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
|
||||||
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
|
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
|
||||||
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
||||||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
||||||
('is_student', models.BooleanField(default=False)),
|
('is_student', models.BooleanField(default=False)),
|
||||||
('is_lecturer', models.BooleanField(default=False)),
|
('is_lecturer', models.BooleanField(default=False)),
|
||||||
|
('is_parent', models.BooleanField(default=False)),
|
||||||
|
('is_dep_head', models.BooleanField(default=False)),
|
||||||
|
('gender', models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female')], max_length=1, null=True)),
|
||||||
('phone', models.CharField(blank=True, max_length=60, null=True)),
|
('phone', models.CharField(blank=True, max_length=60, null=True)),
|
||||||
('address', models.CharField(blank=True, max_length=60, null=True)),
|
('address', models.CharField(blank=True, max_length=60, null=True)),
|
||||||
('picture', models.ImageField(default='default.png', null=True, upload_to='profile_pictures')),
|
('picture', models.ImageField(default='default.png', null=True, upload_to='profile_pictures/%y/%m/%d/')),
|
||||||
('email', models.EmailField(blank=True, max_length=254, null=True)),
|
('email', models.EmailField(blank=True, max_length=254, null=True)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'user',
|
'ordering': ('-date_joined',),
|
||||||
'verbose_name_plural': 'users',
|
|
||||||
'abstract': False,
|
|
||||||
},
|
},
|
||||||
managers=[
|
managers=[
|
||||||
('objects', django.contrib.auth.models.UserManager()),
|
('objects', accounts.models.CustomUserManager()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='DepartmentHead',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'ordering': ('-user__date_joined',),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Parent',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('first_name', models.CharField(max_length=120)),
|
||||||
|
('last_name', models.CharField(max_length=120)),
|
||||||
|
('phone', models.CharField(blank=True, max_length=60, null=True)),
|
||||||
|
('email', models.EmailField(blank=True, max_length=254, null=True)),
|
||||||
|
('relation_ship', models.TextField(blank=True, choices=[('Father', 'Father'), ('Mother', 'Mother'), ('Brother', 'Brother'), ('Sister', 'Sister'), ('Grand mother', 'Grand mother'), ('Grand father', 'Grand father'), ('Other', 'Other')])),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'ordering': ('-user__date_joined',),
|
||||||
|
},
|
||||||
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Student',
|
name='Student',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('level', models.CharField(choices=[('Level course', 'Level course'), ('Bachloar', 'Bachloar'), ('Master', 'Master')], max_length=25, null=True)),
|
('level', models.CharField(choices=[('Bachelor', 'Bachelor Degree'), ('Master', 'Master Degree')], max_length=25, null=True)),
|
||||||
],
|
],
|
||||||
|
options={
|
||||||
|
'ordering': ('-student__date_joined',),
|
||||||
|
},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-29 15:25
|
# Generated by Django 4.0.8 on 2024-08-31 11:51
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
@ -11,29 +11,49 @@ class Migration(migrations.Migration):
|
|||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('accounts', '0001_initial'),
|
('accounts', '0001_initial'),
|
||||||
('auth', '0011_update_proxy_permissions'),
|
('auth', '0012_alter_user_first_name_max_length'),
|
||||||
('course', '0001_initial'),
|
('course', '0001_initial'),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='student',
|
model_name='student',
|
||||||
name='department',
|
name='program',
|
||||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.Program'),
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.program'),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='student',
|
model_name='student',
|
||||||
name='student',
|
name='student',
|
||||||
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
),
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='parent',
|
||||||
|
name='student',
|
||||||
|
field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='accounts.student'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='parent',
|
||||||
|
name='user',
|
||||||
|
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='departmenthead',
|
||||||
|
name='department',
|
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.program'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='departmenthead',
|
||||||
|
name='user',
|
||||||
|
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='user',
|
model_name='user',
|
||||||
name='groups',
|
name='groups',
|
||||||
field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'),
|
field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups'),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='user',
|
model_name='user',
|
||||||
name='user_permissions',
|
name='user_permissions',
|
||||||
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
|
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions'),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-30 04:40
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0002_auto_20200729_1825'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='student',
|
|
||||||
name='level',
|
|
||||||
field=models.CharField(choices=[('Bachloar', 'Bachloar Degree'), ('Master', 'Master Degree')], max_length=25, null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-08-22 19:38
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0003_auto_20200730_0740'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='picture',
|
|
||||||
field=models.ImageField(default='default.png', null=True, upload_to='profile_pictures/%y/%m/%d/'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-08-22 19:46
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0004_auto_20200822_2238'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='picture',
|
|
||||||
field=models.ImageField(blank=True, null=True, upload_to='profile_pictures/%y/%m/%d/'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-08-22 20:08
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0005_auto_20200822_2246'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='picture',
|
|
||||||
field=models.ImageField(default='default.png', null=True, upload_to='profile_pictures/%y/%m/%d/'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 3.1 on 2020-08-25 09:48
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0006_auto_20200822_2308'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='first_name',
|
|
||||||
field=models.CharField(blank=True, max_length=150, verbose_name='first name'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
# Generated by Django 2.2 on 2020-08-31 10:15
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0007_auto_20200825_1248'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='user',
|
|
||||||
name='is_parent',
|
|
||||||
field=models.BooleanField(default=False),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='first_name',
|
|
||||||
field=models.CharField(blank=True, max_length=30, verbose_name='first name'),
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Family',
|
|
||||||
fields=[
|
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('first_name', models.CharField(max_length=120)),
|
|
||||||
('last_name', models.CharField(max_length=120)),
|
|
||||||
('phone', models.CharField(blank=True, max_length=60, null=True)),
|
|
||||||
('address', models.CharField(blank=True, max_length=60, null=True)),
|
|
||||||
('email', models.EmailField(blank=True, max_length=254, null=True)),
|
|
||||||
('relation_ship', models.TextField(blank=True, choices=[('Father', 'Father'), ('Mother', 'Mother'), ('Brother', 'Brother'), ('Sister', 'Sister'), ('Grand mother', 'Grand mother'), ('Grand father', 'Grand father'), ('Other', 'Other')])),
|
|
||||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
# Generated by Django 2.2 on 2020-09-06 11:03
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0008_auto_20200831_1315'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Parent',
|
|
||||||
fields=[
|
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('relation_ship', models.TextField(blank=True, choices=[('Father', 'Father'), ('Mother', 'Mother'), ('Brother', 'Brother'), ('Sister', 'Sister'), ('Grand mother', 'Grand mother'), ('Grand father', 'Grand father'), ('Other', 'Other')])),
|
|
||||||
('student', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='accounts.Student')),
|
|
||||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.DeleteModel(
|
|
||||||
name='Family',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
# Generated by Django 3.1.3 on 2021-04-01 14:18
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0009_auto_20200906_1403'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='parent',
|
|
||||||
name='student',
|
|
||||||
field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='accounts.student'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='parent',
|
|
||||||
name='user',
|
|
||||||
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='first_name',
|
|
||||||
field=models.CharField(blank=True, max_length=150, verbose_name='first name'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# Generated by Django 3.1.3 on 2021-08-23 05:25
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('course', '0004_auto_20200822_2238'),
|
|
||||||
('accounts', '0010_auto_20210401_1718'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='user',
|
|
||||||
name='is_dep_head',
|
|
||||||
field=models.BooleanField(default=False),
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='DepHead',
|
|
||||||
fields=[
|
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('department', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.program')),
|
|
||||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
# Generated by Django 3.1.3 on 2023-01-12 19:38
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('course', '0004_auto_20200822_2238'),
|
|
||||||
('accounts', '0011_auto_20210823_0825'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RenameModel(
|
|
||||||
old_name='DepHead',
|
|
||||||
new_name='DepartmentHead',
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='parent',
|
|
||||||
name='email',
|
|
||||||
field=models.EmailField(blank=True, max_length=254, null=True),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='parent',
|
|
||||||
name='first_name',
|
|
||||||
field=models.CharField(default='first', max_length=120),
|
|
||||||
preserve_default=False,
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='parent',
|
|
||||||
name='last_name',
|
|
||||||
field=models.CharField(default='last', max_length=120),
|
|
||||||
preserve_default=False,
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='parent',
|
|
||||||
name='phone',
|
|
||||||
field=models.CharField(blank=True, max_length=60, null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# Generated by Django 4.1.6 on 2023-02-01 12:30
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0012_auto_20230112_2238'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='departmenthead',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='parent',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='student',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
# Generated by Django 4.1.6 on 2023-05-14 08:05
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
("accounts", "0013_alter_departmenthead_id_alter_parent_id_and_more"),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterModelManagers(
|
|
||||||
name="user",
|
|
||||||
managers=[],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
# Generated by Django 4.0.8 on 2023-12-25 20:16
|
|
||||||
|
|
||||||
import accounts.models
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0014_alter_user_managers'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterModelManagers(
|
|
||||||
name='user',
|
|
||||||
managers=[
|
|
||||||
('objects', accounts.models.UserManager()),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
# Generated by Django 4.0.8 on 2023-12-30 19:04
|
|
||||||
|
|
||||||
import accounts.models
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0015_alter_user_managers'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterModelManagers(
|
|
||||||
name='user',
|
|
||||||
managers=[
|
|
||||||
('objects', accounts.models.CustomUserManager()),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# Generated by Django 4.0.8 on 2023-12-31 07:50
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0016_alter_user_managers'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='departmenthead',
|
|
||||||
options={'ordering': ('-user__date_joined',)},
|
|
||||||
),
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='parent',
|
|
||||||
options={'ordering': ('-user__date_joined',)},
|
|
||||||
),
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='student',
|
|
||||||
options={'ordering': ('-student__date_joined',)},
|
|
||||||
),
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='user',
|
|
||||||
options={'ordering': ('-date_joined',)},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 4.0.8 on 2024-01-06 13:41
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0017_alter_departmenthead_options_alter_parent_options_and_more'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RenameField(
|
|
||||||
model_name='student',
|
|
||||||
old_name='department',
|
|
||||||
new_name='program',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 4.0.8 on 2024-01-31 21:17
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('accounts', '0018_rename_department_student_program'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='user',
|
|
||||||
name='gender',
|
|
||||||
field=models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female')], max_length=1, null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -37,7 +37,6 @@ AUTH_USER_MODEL = "accounts.User"
|
|||||||
DJANGO_APPS = [
|
DJANGO_APPS = [
|
||||||
"jet.dashboard",
|
"jet.dashboard",
|
||||||
"jet",
|
"jet",
|
||||||
"django_extensions",
|
|
||||||
"django.contrib.admin",
|
"django.contrib.admin",
|
||||||
"django.contrib.auth",
|
"django.contrib.auth",
|
||||||
"django.contrib.contenttypes",
|
"django.contrib.contenttypes",
|
||||||
@ -109,24 +108,10 @@ ASGI_APPLICATION = "config.asgi.application"
|
|||||||
# Database
|
# Database
|
||||||
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
|
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
|
||||||
|
|
||||||
# DATABASES = {
|
|
||||||
# 'default': {
|
|
||||||
# 'ENGINE': 'django.db.backends.sqlite3',
|
|
||||||
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
|
|
||||||
# -----------------------------
|
|
||||||
# NOTE: Some model fields may not work on sqlite db,
|
|
||||||
# so consider using postgresql instead
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
"default": {
|
"default": {
|
||||||
"ENGINE": config("DB_ENGINE", default="django.db.backends.postgresql_psycopg2"),
|
"ENGINE": "django.db.backends.sqlite3",
|
||||||
"NAME": config("DB_NAME"),
|
"NAME": os.path.join(BASE_DIR, "db.sqlite3"),
|
||||||
"USER": config("DB_USER"),
|
|
||||||
"PASSWORD": config("DB_PASSWORD"),
|
|
||||||
"HOST": config("DB_HOST", default="localhost"),
|
|
||||||
"PORT": config("DB_PORT", default=5432),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,97 +1,53 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-29 15:25
|
# Generated by Django 4.0.8 on 2024-08-31 11:51
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = []
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name="NewsAndEvents",
|
name='ActivityLog',
|
||||||
fields=[
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"id",
|
('message', models.TextField()),
|
||||||
models.AutoField(
|
('created_at', models.DateTimeField(auto_now=True)),
|
||||||
auto_created=True,
|
|
||||||
primary_key=True,
|
|
||||||
serialize=False,
|
|
||||||
verbose_name="ID",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
("title", models.CharField(max_length=200, null=True)),
|
|
||||||
("summary", models.TextField(blank=True, max_length=200, null=True)),
|
|
||||||
(
|
|
||||||
"posted_as",
|
|
||||||
models.CharField(
|
|
||||||
choices=[("News", "News"), ("Event", "Event")], max_length=10
|
|
||||||
),
|
|
||||||
),
|
|
||||||
("updated_date", models.DateTimeField(auto_now=True, null=True)),
|
|
||||||
("upload_time", models.DateTimeField(auto_now_add=True, null=True)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name="Session",
|
name='NewsAndEvents',
|
||||||
fields=[
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"id",
|
('title', models.CharField(max_length=200, null=True)),
|
||||||
models.AutoField(
|
('summary', models.TextField(blank=True, max_length=200, null=True)),
|
||||||
auto_created=True,
|
('posted_as', models.CharField(choices=[('News', 'News'), ('Event', 'Event')], max_length=10)),
|
||||||
primary_key=True,
|
('updated_date', models.DateTimeField(auto_now=True, null=True)),
|
||||||
serialize=False,
|
('upload_time', models.DateTimeField(auto_now_add=True, null=True)),
|
||||||
verbose_name="ID",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
("session", models.CharField(max_length=200, unique=True)),
|
|
||||||
(
|
|
||||||
"is_current_session",
|
|
||||||
models.BooleanField(blank=True, default=False, null=True),
|
|
||||||
),
|
|
||||||
("next_session_begins", models.DateField(blank=True, null=True)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name="Semester",
|
name='Session',
|
||||||
fields=[
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"id",
|
('session', models.CharField(max_length=200, unique=True)),
|
||||||
models.AutoField(
|
('is_current_session', models.BooleanField(blank=True, default=False, null=True)),
|
||||||
auto_created=True,
|
('next_session_begins', models.DateField(blank=True, null=True)),
|
||||||
primary_key=True,
|
],
|
||||||
serialize=False,
|
),
|
||||||
verbose_name="ID",
|
migrations.CreateModel(
|
||||||
),
|
name='Semester',
|
||||||
),
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"semester",
|
('semester', models.CharField(blank=True, choices=[('First', 'First'), ('Second', 'Second'), ('Third', 'Third')], max_length=10)),
|
||||||
models.CharField(
|
('is_current_semester', models.BooleanField(blank=True, default=False, null=True)),
|
||||||
blank=True,
|
('next_semester_begins', models.DateField(blank=True, null=True)),
|
||||||
choices=[
|
('session', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.session')),
|
||||||
("First", "First"),
|
|
||||||
("Second", "Second"),
|
|
||||||
("Third", "Third"),
|
|
||||||
],
|
|
||||||
max_length=10,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"is_current_semester",
|
|
||||||
models.BooleanField(blank=True, default=False, null=True),
|
|
||||||
),
|
|
||||||
("next_semester_begins", models.DateField(blank=True, null=True)),
|
|
||||||
(
|
|
||||||
"session",
|
|
||||||
models.ForeignKey(
|
|
||||||
blank=True,
|
|
||||||
null=True,
|
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
|
||||||
to="core.Session",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,22 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-30 04:46
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
dependencies = [
|
|
||||||
("core", "0001_initial"),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name="semester",
|
|
||||||
name="semester",
|
|
||||||
field=models.CharField(
|
|
||||||
blank=True,
|
|
||||||
choices=[("First", "First"), ("Second", "Second"), ("Third", "Third")],
|
|
||||||
max_length=10,
|
|
||||||
unique=True,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-30 04:56
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
dependencies = [
|
|
||||||
("core", "0002_auto_20200730_0746"),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name="semester",
|
|
||||||
name="semester",
|
|
||||||
field=models.CharField(
|
|
||||||
blank=True,
|
|
||||||
choices=[("First", "First"), ("Second", "Second"), ("Third", "Third")],
|
|
||||||
max_length=10,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# Generated by Django 4.1.6 on 2023-02-01 12:30
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
dependencies = [
|
|
||||||
("core", "0003_auto_20200730_0756"),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name="newsandevents",
|
|
||||||
name="id",
|
|
||||||
field=models.BigAutoField(
|
|
||||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
|
||||||
),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name="semester",
|
|
||||||
name="id",
|
|
||||||
field=models.BigAutoField(
|
|
||||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
|
||||||
),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name="session",
|
|
||||||
name="id",
|
|
||||||
field=models.BigAutoField(
|
|
||||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
|
||||||
),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
# Generated by Django 4.0.8 on 2024-01-12 15:04
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('core', '0004_alter_newsandevents_id_alter_semester_id_and_more'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='ActivityLog',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('message', models.TextField()),
|
|
||||||
('created_at', models.DateTimeField(auto_now=True)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-29 15:25
|
# Generated by Django 4.0.8 on 2024-08-31 11:51
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import django.core.validators
|
import django.core.validators
|
||||||
@ -7,177 +7,81 @@ import django.db.models.deletion
|
|||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
('accounts', '0001_initial'),
|
||||||
|
('core', '0001_initial'),
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
("core", "0001_initial"),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name="Course",
|
name='Course',
|
||||||
fields=[
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"id",
|
('slug', models.SlugField(blank=True, unique=True)),
|
||||||
models.AutoField(
|
('title', models.CharField(max_length=200, null=True)),
|
||||||
auto_created=True,
|
('code', models.CharField(max_length=200, null=True, unique=True)),
|
||||||
primary_key=True,
|
('credit', models.IntegerField(default=0, null=True)),
|
||||||
serialize=False,
|
('summary', models.TextField(blank=True, max_length=200, null=True)),
|
||||||
verbose_name="ID",
|
('level', models.CharField(choices=[('Bachelor', 'Bachelor Degree'), ('Master', 'Master Degree')], max_length=25, null=True)),
|
||||||
),
|
('year', models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (4, '5'), (4, '6')], default=0)),
|
||||||
),
|
('semester', models.CharField(choices=[('First', 'First'), ('Second', 'Second'), ('Third', 'Third')], max_length=200)),
|
||||||
("slug", models.SlugField(blank=True, unique=True)),
|
('is_elective', models.BooleanField(blank=True, default=False, null=True)),
|
||||||
("title", models.CharField(max_length=200, null=True)),
|
|
||||||
("code", models.CharField(max_length=200, null=True, unique=True)),
|
|
||||||
("credit", models.IntegerField(default=0, null=True)),
|
|
||||||
("summary", models.TextField(blank=True, max_length=200, null=True)),
|
|
||||||
(
|
|
||||||
"level",
|
|
||||||
models.CharField(
|
|
||||||
choices=[
|
|
||||||
("Level course", "Level course"),
|
|
||||||
("Bachloar", "Bachloar"),
|
|
||||||
("Master", "Master"),
|
|
||||||
],
|
|
||||||
max_length=25,
|
|
||||||
null=True,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"year",
|
|
||||||
models.IntegerField(
|
|
||||||
choices=[
|
|
||||||
(1, "1"),
|
|
||||||
(2, "2"),
|
|
||||||
(3, "3"),
|
|
||||||
(4, "4"),
|
|
||||||
(4, "5"),
|
|
||||||
(4, "6"),
|
|
||||||
],
|
|
||||||
default=0,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"semester",
|
|
||||||
models.CharField(
|
|
||||||
choices=[
|
|
||||||
("First", "First"),
|
|
||||||
("Second", "Second"),
|
|
||||||
("Third", "Third"),
|
|
||||||
],
|
|
||||||
max_length=200,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"is_elective",
|
|
||||||
models.BooleanField(blank=True, default=False, null=True),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name="Program",
|
name='Program',
|
||||||
fields=[
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"id",
|
('title', models.CharField(max_length=150, unique=True)),
|
||||||
models.AutoField(
|
('summary', models.TextField(blank=True, null=True)),
|
||||||
auto_created=True,
|
|
||||||
primary_key=True,
|
|
||||||
serialize=False,
|
|
||||||
verbose_name="ID",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
("title", models.CharField(max_length=150, unique=True)),
|
|
||||||
("summary", models.TextField(blank=True, null=True)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name="Upload",
|
name='UploadVideo',
|
||||||
fields=[
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"id",
|
('title', models.CharField(max_length=100)),
|
||||||
models.AutoField(
|
('slug', models.SlugField(blank=True, unique=True)),
|
||||||
auto_created=True,
|
('video', models.FileField(help_text='Valid video formats: mp4, mkv, wmv, 3gp, f4v, avi, mp3', upload_to='course_videos/', validators=[django.core.validators.FileExtensionValidator(['mp4', 'mkv', 'wmv', '3gp', 'f4v', 'avi', 'mp3'])])),
|
||||||
primary_key=True,
|
('summary', models.TextField(blank=True, null=True)),
|
||||||
serialize=False,
|
('timestamp', models.DateTimeField(auto_now_add=True, null=True)),
|
||||||
verbose_name="ID",
|
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.course')),
|
||||||
),
|
|
||||||
),
|
|
||||||
("title", models.CharField(max_length=100)),
|
|
||||||
(
|
|
||||||
"file",
|
|
||||||
models.FileField(
|
|
||||||
upload_to="course_files/",
|
|
||||||
validators=[
|
|
||||||
django.core.validators.FileExtensionValidator(
|
|
||||||
[
|
|
||||||
"pdf",
|
|
||||||
"docx",
|
|
||||||
"doc",
|
|
||||||
"xls",
|
|
||||||
"xlsx",
|
|
||||||
"ppt",
|
|
||||||
"pptx",
|
|
||||||
"zip",
|
|
||||||
"rar",
|
|
||||||
"7zip",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
("updated_date", models.DateTimeField(auto_now=True, null=True)),
|
|
||||||
("upload_time", models.DateTimeField(auto_now_add=True, null=True)),
|
|
||||||
(
|
|
||||||
"course",
|
|
||||||
models.ForeignKey(
|
|
||||||
on_delete=django.db.models.deletion.CASCADE, to="course.Course"
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name="CourseAllocation",
|
name='Upload',
|
||||||
fields=[
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"id",
|
('title', models.CharField(max_length=100)),
|
||||||
models.AutoField(
|
('file', models.FileField(help_text='Valid Files: pdf, docx, doc, xls, xlsx, ppt, pptx, zip, rar, 7zip', upload_to='course_files/', validators=[django.core.validators.FileExtensionValidator(['pdf', 'docx', 'doc', 'xls', 'xlsx', 'ppt', 'pptx', 'zip', 'rar', '7zip'])])),
|
||||||
auto_created=True,
|
('updated_date', models.DateTimeField(auto_now=True, null=True)),
|
||||||
primary_key=True,
|
('upload_time', models.DateTimeField(auto_now_add=True, null=True)),
|
||||||
serialize=False,
|
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.course')),
|
||||||
verbose_name="ID",
|
],
|
||||||
),
|
),
|
||||||
),
|
migrations.CreateModel(
|
||||||
(
|
name='CourseOffer',
|
||||||
"courses",
|
fields=[
|
||||||
models.ManyToManyField(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
related_name="allocated_course", to="course.Course"
|
('dep_head', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.departmenthead')),
|
||||||
),
|
],
|
||||||
),
|
),
|
||||||
(
|
migrations.CreateModel(
|
||||||
"lecturer",
|
name='CourseAllocation',
|
||||||
models.ForeignKey(
|
fields=[
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
related_name="allocated_lecturer",
|
('courses', models.ManyToManyField(related_name='allocated_course', to='course.course')),
|
||||||
to=settings.AUTH_USER_MODEL,
|
('lecturer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='allocated_lecturer', to=settings.AUTH_USER_MODEL)),
|
||||||
),
|
('session', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.session')),
|
||||||
),
|
|
||||||
(
|
|
||||||
"session",
|
|
||||||
models.ForeignKey(
|
|
||||||
blank=True,
|
|
||||||
null=True,
|
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
|
||||||
to="core.Session",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name="course",
|
model_name='course',
|
||||||
name="program",
|
name='program',
|
||||||
field=models.ForeignKey(
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.program'),
|
||||||
on_delete=django.db.models.deletion.CASCADE, to="course.Program"
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,27 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-08-03 09:24
|
|
||||||
|
|
||||||
import django.core.validators
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('course', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='UploadVideo',
|
|
||||||
fields=[
|
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('title', models.CharField(max_length=100)),
|
|
||||||
('slug', models.SlugField(blank=True, unique=True)),
|
|
||||||
('video', models.FileField(upload_to='videos/', validators=[django.core.validators.FileExtensionValidator(['mp4', 'mkv', 'wmv', '3gp', 'f4v', 'avi', 'mp3'])])),
|
|
||||||
('summary', models.TextField(blank=True, null=True)),
|
|
||||||
('timestamp', models.DateTimeField(auto_now_add=True, null=True)),
|
|
||||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.Course')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-08-03 10:35
|
|
||||||
|
|
||||||
import django.core.validators
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('course', '0002_uploadvideo'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='uploadvideo',
|
|
||||||
name='video',
|
|
||||||
field=models.FileField(upload_to='course_videos/', validators=[django.core.validators.FileExtensionValidator(['mp4', 'mkv', 'wmv', '3gp', 'f4v', 'avi', 'mp3'])]),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-08-22 19:38
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('course', '0003_auto_20200803_1335'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='course',
|
|
||||||
name='level',
|
|
||||||
field=models.CharField(choices=[('Bachloar', 'Bachloar Degree'), ('Master', 'Master Degree')], max_length=25, null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
# Generated by Django 4.1.6 on 2023-02-01 12:30
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('course', '0004_auto_20200822_2238'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='course',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='courseallocation',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='program',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='upload',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='uploadvideo',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
# Generated by Django 4.1.6 on 2023-05-14 08:05
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
("accounts", "0014_alter_user_managers"),
|
|
||||||
("course", "0005_alter_course_id_alter_courseallocation_id_and_more"),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name="CourseOffer",
|
|
||||||
fields=[
|
|
||||||
(
|
|
||||||
"id",
|
|
||||||
models.BigAutoField(
|
|
||||||
auto_created=True,
|
|
||||||
primary_key=True,
|
|
||||||
serialize=False,
|
|
||||||
verbose_name="ID",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"dep_head",
|
|
||||||
models.ForeignKey(
|
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
|
||||||
to="accounts.departmenthead",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
# Generated by Django 4.0.8 on 2024-01-16 20:14
|
|
||||||
|
|
||||||
import django.core.validators
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('course', '0006_courseoffer'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='upload',
|
|
||||||
name='file',
|
|
||||||
field=models.FileField(help_text='Valid Files: pdf, docx, doc, xls, xlsx, ppt, pptx, zip, rar, 7zip', upload_to='course_files/', validators=[django.core.validators.FileExtensionValidator(['pdf', 'docx', 'doc', 'xls', 'xlsx', 'ppt', 'pptx', 'zip', 'rar', '7zip'])]),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='uploadvideo',
|
|
||||||
name='video',
|
|
||||||
field=models.FileField(help_text='Valid video formats: mp4, mkv, wmv, 3gp, f4v, avi, mp3', upload_to='course_videos/', validators=[django.core.validators.FileExtensionValidator(['mp4', 'mkv', 'wmv', '3gp', 'f4v', 'avi', 'mp3'])]),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,7 +1,6 @@
|
|||||||
# Generated by Django 3.1.3 on 2021-04-11 09:30
|
# Generated by Django 4.0.8 on 2024-08-31 11:51
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import django.contrib.postgres.fields
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
||||||
@ -15,17 +14,10 @@ class Migration(migrations.Migration):
|
|||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
|
||||||
name='TestClass',
|
|
||||||
fields=[
|
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('test_name', models.CharField(blank=True, max_length=120, null=True)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Invoice',
|
name='Invoice',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('total', models.FloatField(blank=True, null=True)),
|
('total', models.FloatField(blank=True, null=True)),
|
||||||
('amount', models.FloatField(blank=True, null=True)),
|
('amount', models.FloatField(blank=True, null=True)),
|
||||||
('payment_complete', models.BooleanField(default=False)),
|
('payment_complete', models.BooleanField(default=False)),
|
||||||
|
|||||||
@ -1,25 +0,0 @@
|
|||||||
# Generated by Django 3.1.3 on 2021-04-16 09:14
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
# Function to create initial data for array field in PostgreSQL
|
|
||||||
def create_array_field_for_postgres(apps, schema_editor):
|
|
||||||
TestClass = apps.get_model('payments', 'TestClass')
|
|
||||||
TestClass.objects.create(array=[])
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('payments', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
# Adding a JSONField for array, which is supported by both PostgreSQL and MySQL
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='testclass',
|
|
||||||
name='array',
|
|
||||||
field=models.JSONField(blank=True, default=list, null=True),
|
|
||||||
),
|
|
||||||
# Running the create_array_field_for_postgres function to populate initial data in PostgreSQL
|
|
||||||
migrations.RunPython(create_array_field_for_postgres),
|
|
||||||
]
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
# Generated by Django 3.1.3 on 2021-04-16 09:18
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('payments', '0002_testclass_array'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.DeleteModel(
|
|
||||||
name='TestClass',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 4.1.6 on 2023-02-01 12:30
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('payments', '0003_delete_testclass'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='invoice',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-29 15:25
|
# Generated by Django 4.0.8 on 2024-08-31 11:51
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import django.core.validators
|
import django.core.validators
|
||||||
@ -12,16 +12,16 @@ class Migration(migrations.Migration):
|
|||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
('course', '0001_initial'),
|
('course', '0001_initial'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Question',
|
name='Question',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('figure', models.ImageField(blank=True, null=True, upload_to='uploads/%Y/%m/%d', verbose_name='Figure')),
|
('figure', models.ImageField(blank=True, help_text="Add an image for the question if it's necessary.", null=True, upload_to='uploads/%Y/%m/%d', verbose_name='Figure')),
|
||||||
('content', models.CharField(help_text='Enter the question text that you want displayed', max_length=1000, verbose_name='Question')),
|
('content', models.CharField(help_text='Enter the question text that you want displayed', max_length=1000, verbose_name='Question')),
|
||||||
('explanation', models.TextField(blank=True, help_text='Explanation to be shown after the question has been answered.', max_length=2000, verbose_name='Explanation')),
|
('explanation', models.TextField(blank=True, help_text='Explanation to be shown after the question has been answered.', max_length=2000, verbose_name='Explanation')),
|
||||||
],
|
],
|
||||||
@ -33,10 +33,10 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Quiz',
|
name='Quiz',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('title', models.CharField(max_length=60, verbose_name='Title')),
|
('title', models.CharField(max_length=60, verbose_name='Title')),
|
||||||
('slug', models.SlugField(blank=True, unique=True)),
|
('slug', models.SlugField(blank=True, unique=True)),
|
||||||
('description', models.TextField(blank=True, help_text='a description of the quiz', verbose_name='Description')),
|
('description', models.TextField(blank=True, help_text='A detailed description of the quiz', verbose_name='Description')),
|
||||||
('category', models.TextField(blank=True, choices=[('assignment', 'Assignment'), ('exam', 'Exam'), ('practice', 'Practice Quiz')])),
|
('category', models.TextField(blank=True, choices=[('assignment', 'Assignment'), ('exam', 'Exam'), ('practice', 'Practice Quiz')])),
|
||||||
('random_order', models.BooleanField(default=False, help_text='Display the questions in a random order or as they are set?', verbose_name='Random Order')),
|
('random_order', models.BooleanField(default=False, help_text='Display the questions in a random order or as they are set?', verbose_name='Random Order')),
|
||||||
('answers_at_end', models.BooleanField(default=False, help_text='Correct answer is NOT shown after question. Answers displayed at the end.', verbose_name='Answers at end')),
|
('answers_at_end', models.BooleanField(default=False, help_text='Correct answer is NOT shown after question. Answers displayed at the end.', verbose_name='Answers at end')),
|
||||||
@ -45,7 +45,7 @@ class Migration(migrations.Migration):
|
|||||||
('pass_mark', models.SmallIntegerField(blank=True, default=50, help_text='Percentage required to pass exam.', validators=[django.core.validators.MaxValueValidator(100)], verbose_name='Pass Mark')),
|
('pass_mark', models.SmallIntegerField(blank=True, default=50, help_text='Percentage required to pass exam.', validators=[django.core.validators.MaxValueValidator(100)], verbose_name='Pass Mark')),
|
||||||
('draft', models.BooleanField(blank=True, default=False, help_text='If yes, the quiz is not displayed in the quiz list and can only be taken by users who can edit quizzes.', verbose_name='Draft')),
|
('draft', models.BooleanField(blank=True, default=False, help_text='If yes, the quiz is not displayed in the quiz list and can only be taken by users who can edit quizzes.', verbose_name='Draft')),
|
||||||
('timestamp', models.DateTimeField(auto_now=True)),
|
('timestamp', models.DateTimeField(auto_now=True)),
|
||||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.Course')),
|
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.course')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'Quiz',
|
'verbose_name': 'Quiz',
|
||||||
@ -53,9 +53,9 @@ class Migration(migrations.Migration):
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Essay_Question',
|
name='EssayQuestion',
|
||||||
fields=[
|
fields=[
|
||||||
('question_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='quiz.Question')),
|
('question_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='quiz.question')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'Essay style question',
|
'verbose_name': 'Essay style question',
|
||||||
@ -66,7 +66,7 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='MCQuestion',
|
name='MCQuestion',
|
||||||
fields=[
|
fields=[
|
||||||
('question_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='quiz.Question')),
|
('question_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='quiz.question')),
|
||||||
('choice_order', models.CharField(blank=True, choices=[('content', 'Content'), ('random', 'Random'), ('none', 'None')], help_text='The order in which multichoice choice options are displayed to the user', max_length=30, null=True, verbose_name='Choice Order')),
|
('choice_order', models.CharField(blank=True, choices=[('content', 'Content'), ('random', 'Random'), ('none', 'None')], help_text='The order in which multichoice choice options are displayed to the user', max_length=30, null=True, verbose_name='Choice Order')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
@ -78,7 +78,7 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Sitting',
|
name='Sitting',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('question_order', models.CharField(max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Question Order')),
|
('question_order', models.CharField(max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Question Order')),
|
||||||
('question_list', models.CharField(max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Question List')),
|
('question_list', models.CharField(max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Question List')),
|
||||||
('incorrect_questions', models.CharField(blank=True, max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Incorrect questions')),
|
('incorrect_questions', models.CharField(blank=True, max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Incorrect questions')),
|
||||||
@ -87,8 +87,8 @@ class Migration(migrations.Migration):
|
|||||||
('user_answers', models.TextField(blank=True, default='{}', verbose_name='User Answers')),
|
('user_answers', models.TextField(blank=True, default='{}', verbose_name='User Answers')),
|
||||||
('start', models.DateTimeField(auto_now_add=True, verbose_name='Start')),
|
('start', models.DateTimeField(auto_now_add=True, verbose_name='Start')),
|
||||||
('end', models.DateTimeField(blank=True, null=True, verbose_name='End')),
|
('end', models.DateTimeField(blank=True, null=True, verbose_name='End')),
|
||||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.Course', verbose_name='Course')),
|
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.course', verbose_name='Course')),
|
||||||
('quiz', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.Quiz', verbose_name='Quiz')),
|
('quiz', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.quiz', verbose_name='Quiz')),
|
||||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User')),
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
@ -98,12 +98,12 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='question',
|
model_name='question',
|
||||||
name='quiz',
|
name='quiz',
|
||||||
field=models.ManyToManyField(blank=True, to='quiz.Quiz', verbose_name='Quiz'),
|
field=models.ManyToManyField(blank=True, to='quiz.quiz', verbose_name='Quiz'),
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Progress',
|
name='Progress',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('score', models.CharField(max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Score')),
|
('score', models.CharField(max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Score')),
|
||||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User')),
|
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User')),
|
||||||
],
|
],
|
||||||
@ -115,10 +115,10 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Choice',
|
name='Choice',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('choice', models.CharField(help_text='Enter the choice text that you want displayed', max_length=1000, verbose_name='Content')),
|
('choice', models.CharField(help_text='Enter the choice text that you want displayed', max_length=1000, verbose_name='Content')),
|
||||||
('correct', models.BooleanField(default=False, help_text='Is this a correct answer?', verbose_name='Correct')),
|
('correct', models.BooleanField(default=False, help_text='Is this a correct answer?', verbose_name='Correct')),
|
||||||
('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.MCQuestion', verbose_name='Question')),
|
('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.mcquestion', verbose_name='Question')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'Choice',
|
'verbose_name': 'Choice',
|
||||||
|
|||||||
@ -1,38 +0,0 @@
|
|||||||
# Generated by Django 4.1.6 on 2023-02-01 12:30
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('quiz', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='choice',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='progress',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='question',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='quiz',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='sitting',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
# Generated by Django 4.0.8 on 2023-12-30 19:04
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('quiz', '0002_alter_choice_id_alter_progress_id_alter_question_id_and_more'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RenameModel(
|
|
||||||
old_name='Essay_Question',
|
|
||||||
new_name='EssayQuestion',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
# Generated by Django 4.0.8 on 2023-12-31 07:50
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('quiz', '0003_rename_essay_question_essayquestion'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='question',
|
|
||||||
name='figure',
|
|
||||||
field=models.ImageField(blank=True, help_text="Add an image for the question if it's necessary.", null=True, upload_to='uploads/%Y/%m/%d', verbose_name='Figure'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='quiz',
|
|
||||||
name='description',
|
|
||||||
field=models.TextField(blank=True, help_text='A detailed description of the quiz', verbose_name='Description'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,10 +1,5 @@
|
|||||||
-r base.txt
|
-r base.txt
|
||||||
|
|
||||||
psycopg2==2.9.5 # https://github.com/psycopg/psycopg2
|
|
||||||
|
|
||||||
# Code quality
|
# Code quality
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
black==22.12.0 # https://github.com/psf/black
|
black==22.12.0 # https://github.com/psf/black
|
||||||
|
|
||||||
# Django Extensions
|
|
||||||
django-extensions==3.1.3 # https://github.com/django-extensions/django-extensions
|
|
||||||
@ -3,7 +3,6 @@
|
|||||||
-r base.txt
|
-r base.txt
|
||||||
|
|
||||||
gunicorn==20.1.0 # https://github.com/benoitc/gunicorn
|
gunicorn==20.1.0 # https://github.com/benoitc/gunicorn
|
||||||
psycopg2==2.9.5 # https://github.com/psycopg/psycopg2
|
|
||||||
|
|
||||||
# Django
|
# Django
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|||||||
@ -1,158 +1,46 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-29 15:25
|
# Generated by Django 4.0.8 on 2024-08-31 11:51
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
("accounts", "0001_initial"),
|
('accounts', '0001_initial'),
|
||||||
("course", "0001_initial"),
|
('course', '0001_initial'),
|
||||||
("core", "0001_initial"),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name="TakenCourse",
|
name='TakenCourse',
|
||||||
fields=[
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"id",
|
('assignment', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)),
|
||||||
models.AutoField(
|
('mid_exam', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)),
|
||||||
auto_created=True,
|
('quiz', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)),
|
||||||
primary_key=True,
|
('attendance', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)),
|
||||||
serialize=False,
|
('final_exam', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)),
|
||||||
verbose_name="ID",
|
('total', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)),
|
||||||
),
|
('grade', models.CharField(blank=True, choices=[('A+', 'A+'), ('A', 'A'), ('A-', 'A-'), ('B+', 'B+'), ('B', 'B'), ('B-', 'B-'), ('C+', 'C+'), ('C', 'C'), ('C-', 'C-'), ('D', 'D'), ('F', 'F'), ('NG', 'NG')], max_length=2)),
|
||||||
),
|
('point', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)),
|
||||||
(
|
('comment', models.CharField(blank=True, choices=[('PASS', 'PASS'), ('FAIL', 'FAIL')], max_length=200)),
|
||||||
"assignment",
|
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='taken_courses', to='course.course')),
|
||||||
models.DecimalField(decimal_places=2, default=0.0, max_digits=5),
|
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.student')),
|
||||||
),
|
|
||||||
(
|
|
||||||
"mid_exam",
|
|
||||||
models.DecimalField(decimal_places=2, default=0.0, max_digits=5),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"quiz",
|
|
||||||
models.DecimalField(decimal_places=2, default=0.0, max_digits=5),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"attendance",
|
|
||||||
models.DecimalField(decimal_places=2, default=0.0, max_digits=5),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"final_exam",
|
|
||||||
models.DecimalField(decimal_places=2, default=0.0, max_digits=5),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"total",
|
|
||||||
models.DecimalField(decimal_places=2, default=0.0, max_digits=5),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"grade",
|
|
||||||
models.CharField(
|
|
||||||
blank=True,
|
|
||||||
choices=[
|
|
||||||
("A+", "A+"),
|
|
||||||
("A", "A"),
|
|
||||||
("A-", "A-"),
|
|
||||||
("B+", "B+"),
|
|
||||||
("B", "B"),
|
|
||||||
("B-", "B-"),
|
|
||||||
("C+", "C+"),
|
|
||||||
("C", "C"),
|
|
||||||
("C-", "C-"),
|
|
||||||
("D", "D"),
|
|
||||||
("F", "F"),
|
|
||||||
("NG", "NG"),
|
|
||||||
],
|
|
||||||
max_length=1,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"point",
|
|
||||||
models.DecimalField(decimal_places=2, default=0.0, max_digits=5),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"comment",
|
|
||||||
models.CharField(
|
|
||||||
blank=True,
|
|
||||||
choices=[("PASS", "PASS"), ("FAIL", "FAIL")],
|
|
||||||
max_length=200,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"course",
|
|
||||||
models.ForeignKey(
|
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
|
||||||
related_name="taken_courses",
|
|
||||||
to="course.Course",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"student",
|
|
||||||
models.ForeignKey(
|
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
|
||||||
to="accounts.Student",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name="Result",
|
name='Result',
|
||||||
fields=[
|
fields=[
|
||||||
(
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
"id",
|
('gpa', models.FloatField(null=True)),
|
||||||
models.AutoField(
|
('cgpa', models.FloatField(null=True)),
|
||||||
auto_created=True,
|
('semester', models.CharField(choices=[('First', 'First'), ('Second', 'Second'), ('Third', 'Third')], max_length=100)),
|
||||||
primary_key=True,
|
('session', models.CharField(blank=True, max_length=100, null=True)),
|
||||||
serialize=False,
|
('level', models.CharField(choices=[('Bachloar', 'Bachloar Degree'), ('Master', 'Master Degree')], max_length=25, null=True)),
|
||||||
verbose_name="ID",
|
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.student')),
|
||||||
),
|
|
||||||
),
|
|
||||||
("gpa", models.FloatField(null=True)),
|
|
||||||
("cgpa", models.FloatField(null=True)),
|
|
||||||
(
|
|
||||||
"semester",
|
|
||||||
models.CharField(
|
|
||||||
choices=[
|
|
||||||
("First", "First"),
|
|
||||||
("Second", "Second"),
|
|
||||||
("Third", "Third"),
|
|
||||||
],
|
|
||||||
max_length=100,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"level",
|
|
||||||
models.CharField(
|
|
||||||
choices=[
|
|
||||||
("Level course", "Level course"),
|
|
||||||
("Bachloar", "Bachloar"),
|
|
||||||
("Master", "Master"),
|
|
||||||
],
|
|
||||||
max_length=25,
|
|
||||||
null=True,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"session",
|
|
||||||
models.ForeignKey(
|
|
||||||
blank=True,
|
|
||||||
null=True,
|
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
|
||||||
to="core.Session",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"student",
|
|
||||||
models.ForeignKey(
|
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
|
||||||
to="accounts.Student",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-07-29 19:33
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('result', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='result',
|
|
||||||
name='session',
|
|
||||||
field=models.CharField(blank=True, max_length=100, null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 2.2.3 on 2020-08-22 19:38
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('result', '0002_auto_20200729_2233'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='result',
|
|
||||||
name='level',
|
|
||||||
field=models.CharField(choices=[('Bachloar', 'Bachloar Degree'), ('Master', 'Master Degree')], max_length=25, null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 3.1 on 2020-08-25 09:48
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('result', '0003_auto_20200822_2238'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='takencourse',
|
|
||||||
name='grade',
|
|
||||||
field=models.CharField(blank=True, choices=[('A+', 'A+'), ('A', 'A'), ('A-', 'A-'), ('B+', 'B+'), ('B', 'B'), ('B-', 'B-'), ('C+', 'C+'), ('C', 'C'), ('C-', 'C-'), ('D', 'D'), ('F', 'F'), ('NG', 'NG')], max_length=2),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
# Generated by Django 4.1.6 on 2023-02-01 12:30
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('result', '0004_auto_20200825_1248'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='result',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='takencourse',
|
|
||||||
name='id',
|
|
||||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -18,7 +18,7 @@
|
|||||||
{% for student in students %}<h3>{{ student.student.user.get_full_name }}</h3>{% endfor %}
|
{% for student in students %}<h3>{{ student.student.user.get_full_name }}</h3>{% endfor %}
|
||||||
{% for marking in marking_list %}<h3>{{ marking }} <small>{{ forloop.counter }}</small></h3>{% endfor %}
|
{% for marking in marking_list %}<h3>{{ marking }} <small>{{ forloop.counter }}</small></h3>{% endfor %}
|
||||||
|
|
||||||
<form action="" method="GET" class="form-inline justify-content-center bg-white p-4 my-3">
|
<form action="" method="GET" class="form-inline justify-content-center bg-white p-4 my-3 d-flex gap-3">
|
||||||
<input type="text" name="user_filter" class="form-control" placeholder="User" value="{{ request.GET.user_filter }}">
|
<input type="text" name="user_filter" class="form-control" placeholder="User" value="{{ request.GET.user_filter }}">
|
||||||
<input type="text" name="quiz_filter" class="form-control" placeholder="Quiz" value="{{ request.GET.quiz_filter }}">
|
<input type="text" name="quiz_filter" class="form-control" placeholder="Quiz" value="{{ request.GET.quiz_filter }}">
|
||||||
<button type="submit" class="btn btn-outline-secondary">{% trans "Filter"%}</button>
|
<button type="submit" class="btn btn-outline-secondary">{% trans "Filter"%}</button>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user