cfl-common 5.3.0__py3-none-any.whl → 8.9.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. cfl_common-8.9.15.dist-info/METADATA +47 -0
  2. cfl_common-8.9.15.dist-info/RECORD +99 -0
  3. {cfl_common-5.3.0.dist-info → cfl_common-8.9.15.dist-info}/WHEEL +1 -1
  4. common/app_settings.py +35 -5
  5. common/csp_config.py +85 -0
  6. common/fixtures/aimmo_characters.json +30 -30
  7. common/fixtures/aimmo_characters2.json +1 -1
  8. common/fixtures/aimmo_characters3.json +35 -0
  9. common/helpers/data_migration_loader.py +3 -4
  10. common/helpers/emails.py +228 -108
  11. common/helpers/generators.py +1 -1
  12. common/helpers/organisation.py +10 -0
  13. common/mail.py +201 -0
  14. common/migrations/0002_emailverification.py +1 -3
  15. common/migrations/0005_add_worksheets.py +2 -13
  16. common/migrations/0007_add_pdf_names_to_first_two_worksheets.py +2 -14
  17. common/migrations/0008_unlock_worksheet_3.py +1 -6
  18. common/migrations/0011_student_login_id.py +3 -3
  19. common/migrations/0012_usersession.py +39 -0
  20. common/migrations/0013_class_school.py +42 -0
  21. common/migrations/0014_login_type.py +29 -0
  22. common/migrations/0015_dailyactivity.py +31 -0
  23. common/migrations/0016_joinreleasestudent.py +42 -0
  24. common/migrations/0017_copy_email_to_username.py +18 -0
  25. common/migrations/0018_update_aimmo_character_image_path.py +15 -0
  26. common/migrations/0019_aimmocharacter_alt.py +16 -0
  27. common/migrations/0020_class_is_active_and_null_access_code.py +23 -0
  28. common/migrations/0021_school_is_active.py +28 -0
  29. common/migrations/0022_school_cleanup.py +29 -0
  30. common/migrations/0023_userprofile_aimmo_badges.py +22 -0
  31. common/migrations/0024_teacher_invited_by.py +25 -0
  32. common/migrations/0025_schoolteacherinvitation.py +47 -0
  33. common/migrations/0026_teacher_remove_join_request.py +22 -0
  34. common/migrations/0027_class_created_by.py +25 -0
  35. common/migrations/0028_coding_club_downloads.py +23 -0
  36. common/migrations/0029_dynamicelement.py +22 -0
  37. common/migrations/0030_add_maintenance_banner.py +25 -0
  38. common/migrations/0031_improve_admin_panel.py +56 -0
  39. common/migrations/0032_dailyactivity_level_control_submits.py +18 -0
  40. common/migrations/0033_password_reset_tracking_fields.py +23 -0
  41. common/migrations/0034_dailyactivity_daily_school_student_lockout_reset.py +18 -0
  42. common/migrations/0035_rename_lockout_fields.py +27 -0
  43. common/migrations/0036_rename_awaiting_email_verification_userprofile_is_verified.py +17 -0
  44. common/migrations/0037_migrate_email_verification.py +21 -0
  45. common/migrations/0038_delete_emailverification.py +16 -0
  46. common/migrations/0039_copy_email_to_username.py +18 -0
  47. common/migrations/0040_school_county.py +18 -0
  48. common/migrations/0041_populate_gb_counties.py +27 -0
  49. common/migrations/0042_totalactivity.py +25 -0
  50. common/migrations/0043_add_total_activity.py +30 -0
  51. common/migrations/0044_update_activity_models.py +33 -0
  52. common/migrations/0045_otp.py +23 -0
  53. common/migrations/0046_alter_school_country.py +19 -0
  54. common/migrations/0047_delete_school_postcode.py +16 -0
  55. common/migrations/0048_unique_school_names.py +42 -0
  56. common/migrations/0049_anonymise_orphan_users.py +29 -0
  57. common/migrations/0050_anonymise_orphan_schools.py +30 -0
  58. common/migrations/0051_verify_returning_users.py +26 -0
  59. common/migrations/0052_add_cse_fields.py +68 -0
  60. common/migrations/0053_clean_class_data.py +24 -0
  61. common/migrations/0054_delete_aimmo_models.py +20 -0
  62. common/migrations/0055_alter_schoolteacherinvitation_token.py +18 -0
  63. common/migrations/0056_set_non_school_teachers_as_non_admins.py +25 -0
  64. common/migrations/0057_teacher_teacher__is_admin.py +19 -0
  65. common/migrations/0058_userprofile_google_refresh_token_and_more.py +24 -0
  66. common/models.py +347 -63
  67. common/permissions.py +20 -8
  68. common/static/common/img/RR_logo.svg +336 -0
  69. common/static/common/img/brain.svg +1 -0
  70. common/templates/common/onetrust_cookies_consent_notice.html +6 -6
  71. common/tests/test_migration_anonymise_orphan_schools.py +30 -0
  72. common/tests/test_migration_anonymise_orphan_users.py +30 -0
  73. common/tests/test_migration_blocked_time.py +3 -11
  74. common/tests/test_migration_remove_teacher_title.py +1 -3
  75. common/tests/test_migration_unique_school_names.py +33 -0
  76. common/tests/test_migration_verify_returning_users.py +59 -0
  77. common/tests/test_models.py +49 -43
  78. common/tests/utils/classes.py +1 -3
  79. common/tests/utils/email.py +11 -49
  80. common/tests/utils/organisation.py +10 -14
  81. common/tests/utils/student.py +14 -67
  82. common/tests/utils/teacher.py +16 -38
  83. common/tests/utils/user.py +1 -3
  84. cfl_common-5.3.0.dist-info/METADATA +0 -20
  85. cfl_common-5.3.0.dist-info/RECORD +0 -48
  86. common/email_messages.py +0 -218
  87. common/fixtures/unlock_worksheet3.json +0 -20
  88. common/fixtures/worksheets.json +0 -98
  89. common/fixtures/worksheets2.json +0 -110
  90. common/tests/test_migration_aimmo_characters.py +0 -31
  91. common/tests/test_migration_worksheets.py +0 -49
  92. {cfl_common-5.3.0.dist-info → cfl_common-8.9.15.dist-info}/top_level.txt +0 -0
@@ -1,19 +1,8 @@
1
- from common.helpers.data_migration_loader import load_data_from_file
2
1
  from django.db import migrations
3
2
 
4
3
 
5
4
  class Migration(migrations.Migration):
6
5
 
7
- dependencies = [
8
- ("common", "0004_add_aimmocharacters"),
9
- ("aimmo", "0020_add_info_to_worksheet"),
10
- ]
6
+ dependencies = [("common", "0004_add_aimmocharacters")]
11
7
 
12
- def dummy_reverse_code(app, schema_editor):
13
- pass
14
-
15
- operations = [
16
- migrations.RunPython(
17
- load_data_from_file("worksheets.json"), reverse_code=dummy_reverse_code
18
- )
19
- ]
8
+ operations = [migrations.RunPython(migrations.RunPython.noop, reverse_code=migrations.RunPython.noop)]
@@ -1,20 +1,8 @@
1
- from common.helpers.data_migration_loader import load_data_from_file
2
1
  from django.db import migrations
3
2
 
4
3
 
5
4
  class Migration(migrations.Migration):
6
5
 
7
- dependencies = [
8
- ("common", "0006_update_aimmo_character_image_path"),
9
- ("aimmo", "0021_add_pdf_names_to_worksheet"),
10
- ]
6
+ dependencies = [("common", "0006_update_aimmo_character_image_path")]
11
7
 
12
- def dummy_reverse_code(app, schema_editor):
13
- pass
14
-
15
- operations = [
16
- migrations.RunPython(
17
- load_data_from_file("worksheets2.json"),
18
- reverse_code=dummy_reverse_code,
19
- )
20
- ]
8
+ operations = [migrations.RunPython(migrations.RunPython.noop, reverse_code=migrations.RunPython.noop)]
@@ -8,9 +8,4 @@ class Migration(migrations.Migration):
8
8
  ("common", "0007_add_pdf_names_to_first_two_worksheets"),
9
9
  ]
10
10
 
11
- operations = [
12
- migrations.RunPython(
13
- load_data_from_file("unlock_worksheet3.json"),
14
- reverse_code=migrations.RunPython.noop,
15
- )
16
- ]
11
+ operations = [migrations.RunPython(migrations.RunPython.noop, reverse_code=migrations.RunPython.noop)]
@@ -6,13 +6,13 @@ from django.db import migrations, models
6
6
  class Migration(migrations.Migration):
7
7
 
8
8
  dependencies = [
9
- ('common', '0010_remove_teacher_title'),
9
+ ("common", "0010_remove_teacher_title"),
10
10
  ]
11
11
 
12
12
  operations = [
13
13
  migrations.AddField(
14
- model_name='student',
15
- name='login_id',
14
+ model_name="student",
15
+ name="login_id",
16
16
  field=models.CharField(max_length=64, null=True),
17
17
  ),
18
18
  ]
@@ -0,0 +1,39 @@
1
+ # Generated by Django 2.2.24 on 2021-10-12 16:22
2
+
3
+ from django.conf import settings
4
+ from django.db import migrations, models
5
+ import django.db.models.deletion
6
+ import django.utils.timezone
7
+
8
+
9
+ class Migration(migrations.Migration):
10
+
11
+ dependencies = [
12
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13
+ ("common", "0011_student_login_id"),
14
+ ]
15
+
16
+ operations = [
17
+ migrations.CreateModel(
18
+ name="UserSession",
19
+ fields=[
20
+ (
21
+ "id",
22
+ models.AutoField(
23
+ auto_created=True,
24
+ primary_key=True,
25
+ serialize=False,
26
+ verbose_name="ID",
27
+ ),
28
+ ),
29
+ ("login_time", models.DateTimeField(default=django.utils.timezone.now)),
30
+ (
31
+ "user",
32
+ models.ForeignKey(
33
+ on_delete=django.db.models.deletion.CASCADE,
34
+ to=settings.AUTH_USER_MODEL,
35
+ ),
36
+ ),
37
+ ],
38
+ ),
39
+ ]
@@ -0,0 +1,42 @@
1
+ # Generated by Django 2.2.24 on 2021-10-15 15:10
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("common", "0012_usersession"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="class",
16
+ name="creation_time",
17
+ field=models.DateTimeField(null=True),
18
+ ),
19
+ migrations.AddField(
20
+ model_name="school",
21
+ name="creation_time",
22
+ field=models.DateTimeField(null=True),
23
+ ),
24
+ migrations.AddField(
25
+ model_name="usersession",
26
+ name="class_field",
27
+ field=models.ForeignKey(
28
+ null=True,
29
+ on_delete=django.db.models.deletion.SET_NULL,
30
+ to="common.Class",
31
+ ),
32
+ ),
33
+ migrations.AddField(
34
+ model_name="usersession",
35
+ name="school",
36
+ field=models.ForeignKey(
37
+ null=True,
38
+ on_delete=django.db.models.deletion.SET_NULL,
39
+ to="common.School",
40
+ ),
41
+ ),
42
+ ]
@@ -0,0 +1,29 @@
1
+ # Generated by Django 2.2.24 on 2021-11-09 15:39
2
+
3
+ from django.db import migrations, models
4
+ import django.utils.timezone
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("common", "0013_class_school"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="usersession",
16
+ name="login_type",
17
+ field=models.CharField(max_length=100, null=True),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name="class",
21
+ name="creation_time",
22
+ field=models.DateTimeField(default=django.utils.timezone.now, null=True),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name="school",
26
+ name="creation_time",
27
+ field=models.DateTimeField(default=django.utils.timezone.now, null=True),
28
+ ),
29
+ ]
@@ -0,0 +1,31 @@
1
+ # Generated by Django 2.2.24 on 2021-12-06 15:03
2
+
3
+ from django.db import migrations, models
4
+ import django.utils.timezone
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("common", "0014_login_type"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.CreateModel(
15
+ name="DailyActivity",
16
+ fields=[
17
+ (
18
+ "id",
19
+ models.AutoField(
20
+ auto_created=True,
21
+ primary_key=True,
22
+ serialize=False,
23
+ verbose_name="ID",
24
+ ),
25
+ ),
26
+ ("date", models.DateField(default=django.utils.timezone.now)),
27
+ ("csv_click_count", models.PositiveIntegerField(default=0)),
28
+ ("login_cards_click_count", models.PositiveIntegerField(default=0)),
29
+ ],
30
+ ),
31
+ ]
@@ -0,0 +1,42 @@
1
+ # Generated by Django 2.2.26 on 2022-02-10 17:13
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+ import django.utils.timezone
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ("common", "0015_dailyactivity"),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.CreateModel(
16
+ name="JoinReleaseStudent",
17
+ fields=[
18
+ (
19
+ "id",
20
+ models.AutoField(
21
+ auto_created=True,
22
+ primary_key=True,
23
+ serialize=False,
24
+ verbose_name="ID",
25
+ ),
26
+ ),
27
+ ("action_type", models.CharField(max_length=64)),
28
+ (
29
+ "action_time",
30
+ models.DateTimeField(default=django.utils.timezone.now),
31
+ ),
32
+ (
33
+ "student",
34
+ models.ForeignKey(
35
+ on_delete=django.db.models.deletion.CASCADE,
36
+ related_name="student",
37
+ to="common.Student",
38
+ ),
39
+ ),
40
+ ],
41
+ ),
42
+ ]
@@ -0,0 +1,18 @@
1
+ from django.db import migrations
2
+
3
+
4
+ def copy_email_to_username(apps, schema):
5
+ Student = apps.get_model("common", "Student")
6
+ independent_students = Student.objects.filter(class_field__isnull=True, new_user__is_active=True)
7
+ for student in independent_students:
8
+ student.new_user.username = student.new_user.email
9
+ student.new_user.save()
10
+
11
+
12
+ class Migration(migrations.Migration):
13
+
14
+ dependencies = [
15
+ ("common", "0016_joinreleasestudent"),
16
+ ]
17
+
18
+ operations = [migrations.RunPython(code=copy_email_to_username, reverse_code=migrations.RunPython.noop)]
@@ -0,0 +1,15 @@
1
+ from common.helpers.data_migration_loader import load_data_from_file
2
+ from django.db import migrations, models
3
+
4
+
5
+ class Migration(migrations.Migration):
6
+
7
+ dependencies = [("common", "0017_copy_email_to_username")]
8
+
9
+ operations = [
10
+ migrations.AddField(
11
+ "AimmoCharacter",
12
+ "alt",
13
+ models.CharField(max_length=255, null=True),
14
+ ),
15
+ ]
@@ -0,0 +1,16 @@
1
+ from common.helpers.data_migration_loader import load_data_from_file
2
+ from django.db import migrations, models
3
+
4
+
5
+ class Migration(migrations.Migration):
6
+
7
+ dependencies = [
8
+ ("common", "0018_update_aimmo_character_image_path"),
9
+ ]
10
+
11
+ operations = [
12
+ migrations.RunPython(
13
+ load_data_from_file("aimmo_characters3.json"),
14
+ reverse_code=migrations.RunPython.noop,
15
+ )
16
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 3.2.12 on 2022-04-07 16:46
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("common", "0019_aimmocharacter_alt"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="class",
15
+ name="is_active",
16
+ field=models.BooleanField(default=True),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name="class",
20
+ name="access_code",
21
+ field=models.CharField(max_length=5, null=True),
22
+ ),
23
+ ]
@@ -0,0 +1,28 @@
1
+ # Generated by Django 3.2.13 on 2022-04-29 17:00
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("common", "0020_class_is_active_and_null_access_code"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="school",
15
+ name="is_active",
16
+ field=models.BooleanField(default=True),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name="school",
20
+ name="postcode",
21
+ field=models.CharField(max_length=10, null=True),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name="school",
25
+ name="town",
26
+ field=models.CharField(max_length=200, null=True),
27
+ ),
28
+ ]
@@ -0,0 +1,29 @@
1
+ # Generated by Django 3.2.13 on 2022-05-03 11:01
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("common", "0021_school_is_active"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name="school",
15
+ name="latitude",
16
+ ),
17
+ migrations.RemoveField(
18
+ model_name="school",
19
+ name="longitude",
20
+ ),
21
+ migrations.RemoveField(
22
+ model_name="school",
23
+ name="town",
24
+ ),
25
+ migrations.RemoveField(
26
+ model_name="userprofile",
27
+ name="can_view_aggregated_data",
28
+ ),
29
+ ]
@@ -0,0 +1,22 @@
1
+ # Generated by Django 3.2.13 on 2022-05-17 17:05
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("common", "0022_school_cleanup"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterModelOptions(
14
+ name="school",
15
+ options={},
16
+ ),
17
+ migrations.AddField(
18
+ model_name="userprofile",
19
+ name="aimmo_badges",
20
+ field=models.CharField(blank=True, max_length=200, null=True),
21
+ ),
22
+ ]
@@ -0,0 +1,25 @@
1
+ # Generated by Django 3.2.13 on 2022-06-07 17:20
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("common", "0023_userprofile_aimmo_badges"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="teacher",
16
+ name="invited_by",
17
+ field=models.ForeignKey(
18
+ blank=True,
19
+ null=True,
20
+ on_delete=django.db.models.deletion.SET_NULL,
21
+ related_name="invited_teachers",
22
+ to="common.teacher",
23
+ ),
24
+ ),
25
+ ]
@@ -0,0 +1,47 @@
1
+ # Generated by Django 3.2.13 on 2022-06-15 10:22
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+ import django.utils.timezone
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ("common", "0024_teacher_invited_by"),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.CreateModel(
16
+ name="SchoolTeacherInvitation",
17
+ fields=[
18
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
19
+ ("token", models.CharField(max_length=32)),
20
+ ("invited_teacher_first_name", models.CharField(max_length=150)),
21
+ ("invited_teacher_last_name", models.CharField(max_length=150)),
22
+ ("invited_teacher_email", models.EmailField(max_length=254)),
23
+ ("invited_teacher_is_admin", models.BooleanField(default=False)),
24
+ ("expiry", models.DateTimeField()),
25
+ ("creation_time", models.DateTimeField(default=django.utils.timezone.now, null=True)),
26
+ ("is_active", models.BooleanField(default=True)),
27
+ (
28
+ "from_teacher",
29
+ models.ForeignKey(
30
+ null=True,
31
+ on_delete=django.db.models.deletion.SET_NULL,
32
+ related_name="school_invitations",
33
+ to="common.teacher",
34
+ ),
35
+ ),
36
+ (
37
+ "school",
38
+ models.ForeignKey(
39
+ null=True,
40
+ on_delete=django.db.models.deletion.SET_NULL,
41
+ related_name="teacher_invitations",
42
+ to="common.school",
43
+ ),
44
+ ),
45
+ ],
46
+ ),
47
+ ]
@@ -0,0 +1,22 @@
1
+ # Generated by Django 3.2.13 on 2022-06-22 15:33
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("common", "0025_schoolteacherinvitation"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name="teacher",
15
+ name="pending_join_request",
16
+ ),
17
+ migrations.AlterField(
18
+ model_name="teacher",
19
+ name="blocked_time",
20
+ field=models.DateTimeField(blank=True, null=True),
21
+ ),
22
+ ]
@@ -0,0 +1,25 @@
1
+ # Generated by Django 3.2.13 on 2022-07-13 16:04
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("common", "0026_teacher_remove_join_request"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="class",
16
+ name="created_by",
17
+ field=models.ForeignKey(
18
+ blank=True,
19
+ null=True,
20
+ on_delete=django.db.models.deletion.SET_NULL,
21
+ related_name="created_classes",
22
+ to="common.teacher",
23
+ ),
24
+ ),
25
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 3.2.15 on 2022-09-08 15:27
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("common", "0027_class_created_by"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="dailyactivity",
15
+ name="primary_coding_club_downloads",
16
+ field=models.PositiveIntegerField(default=0),
17
+ ),
18
+ migrations.AddField(
19
+ model_name="dailyactivity",
20
+ name="python_coding_club_downloads",
21
+ field=models.PositiveIntegerField(default=0),
22
+ ),
23
+ ]
@@ -0,0 +1,22 @@
1
+ # Generated by Django 3.2.15 on 2022-10-12 12:20
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("common", "0028_coding_club_downloads"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.CreateModel(
14
+ name="DynamicElement",
15
+ fields=[
16
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
17
+ ("name", models.CharField(max_length=64, unique=True, editable=False)),
18
+ ("active", models.BooleanField(default=False)),
19
+ ("text", models.TextField(blank=True, null=True)),
20
+ ],
21
+ ),
22
+ ]
@@ -0,0 +1,25 @@
1
+ # Generated by Django 2.0 on 2020-10-28 17:36
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ def add_maintenance_banner(apps, schema_editor):
7
+ """
8
+ This creates the maintenance banner dynamic element which allows us to edit and turn on and off the maintenance
9
+ banner dynamically from the admin panel.
10
+ """
11
+ DynamicElement = apps.get_model("common", "DynamicElement")
12
+ DynamicElement.objects.create(name="Maintenance banner")
13
+
14
+
15
+ def remove_maintenance_banner(apps, schema_editor):
16
+ DynamicElement = apps.get_model("common", "DynamicElement")
17
+ maintenance_banner = DynamicElement.objects.get(name="Maintenance banner")
18
+ maintenance_banner.delete()
19
+
20
+
21
+ class Migration(migrations.Migration):
22
+
23
+ dependencies = [("common", "0029_dynamicelement")]
24
+
25
+ operations = [migrations.RunPython(add_maintenance_banner, remove_maintenance_banner)]
@@ -0,0 +1,56 @@
1
+ # Generated by Django 3.2.16 on 2022-11-22 16:42
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("common", "0030_add_maintenance_banner"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterModelOptions(
15
+ name="dailyactivity",
16
+ options={"verbose_name_plural": "Daily activities"},
17
+ ),
18
+ migrations.AlterField(
19
+ model_name="student",
20
+ name="blocked_time",
21
+ field=models.DateTimeField(blank=True, null=True),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name="student",
25
+ name="class_field",
26
+ field=models.ForeignKey(
27
+ blank=True,
28
+ null=True,
29
+ on_delete=django.db.models.deletion.CASCADE,
30
+ related_name="students",
31
+ to="common.class",
32
+ ),
33
+ ),
34
+ migrations.AlterField(
35
+ model_name="student",
36
+ name="pending_class_request",
37
+ field=models.ForeignKey(
38
+ blank=True,
39
+ null=True,
40
+ on_delete=django.db.models.deletion.SET_NULL,
41
+ related_name="class_request",
42
+ to="common.class",
43
+ ),
44
+ ),
45
+ migrations.AlterField(
46
+ model_name="teacher",
47
+ name="school",
48
+ field=models.ForeignKey(
49
+ blank=True,
50
+ null=True,
51
+ on_delete=django.db.models.deletion.SET_NULL,
52
+ related_name="teacher_school",
53
+ to="common.school",
54
+ ),
55
+ ),
56
+ ]