From dfa1b62151cdfcdf736190d7510c40adb20b9e51 Mon Sep 17 00:00:00 2001 From: ozone Date: Tue, 14 Jan 2025 16:39:03 +0545 Subject: [PATCH] chore:migrate to django_ckeditor_5 --- Dockerfile | 5 +- context/migrations/0001_initial.py | 55 +- context/migrations/0002_add_verbose_name.py | 151 ------ context/migrations/0002_initial.py | 38 ++ .../0003_increase_code_max_length.py | 23 - .../0004_module_question_completion_time.py | 18 - docker/entrypoint.dev.sh | 1 + neatplus/serializers.py | 23 - neatplus/settings.py | 221 +++----- neatplus/storage_backends.py | 5 - neatplus/tests/__init__.py | 5 +- neatplus/urls.py | 8 +- neatplus/views.py | 27 + notification/migrations/0001_initial.py | 46 +- notification/migrations/0002_initial.py | 39 ++ notification/migrations/0002_notice.py | 34 -- .../migrations/0003_add_verbose_name.py | 129 ----- notification/models.py | 4 +- organization/migrations/0001_initial.py | 36 +- organization/migrations/0002_initial.py | 64 +++ .../0002_organization_description.py | 25 - ...0003_organization_member_request_status.py | 42 -- .../migrations/0004_organization_logo.py | 18 - .../migrations/0005_organization_acronym.py | 18 - .../migrations/0006_organization_mptt.py | 44 -- .../0007_organization_mptt_rebuild.py | 25 - .../migrations/0008_add_verbose_name.py | 117 ---- project/migrations/0001_initial.py | 39 +- .../0002_alter_project_organization.py | 20 - project/migrations/0002_initial.py | 65 +++ .../0003_project_share_analytics_with_neat.py | 18 - project/migrations/0004_add_verbose_name.py | 113 ---- ...05_fix_visibiltiy_choices_readable_name.py | 18 - pyproject.toml | 2 +- statement/migrations/0001_initial.py | 213 +++----- statement/migrations/0002_initial.py | 248 +++++++++ statement/migrations/0002_statement_tags.py | 60 -- .../0003_statement_is_experimental.py | 18 - statement/migrations/0004_add_verbose_name.py | 513 ------------------ .../0005_statement_question_option_version.py | 51 -- .../0006_make_initial_version_active.py | 20 - .../0007_increase_code_max_length.py | 33 -- ...08_delete_option_mitigation_opportunity.py | 43 -- .../0009_statement_question_groups.py | 19 - .../0010_add_question_group_to_weightage.py | 77 --- .../0011_create_statement_formula.py | 40 -- .../0012_create_statement_formula_version.py | 48 -- ...tigation_opportunity_multiple_statement.py | 38 -- .../0014_single_statement_to_m2m.py | 30 - ...dd_options_field_mitigation_opportunity.py | 32 -- ...16_add_new_fields_migration_opportunity.py | 43 -- summary/migrations/0001_initial.py | 32 +- summary/migrations/0002_initial.py | 78 +++ .../migrations/0002_surveyresult_module.py | 20 - .../migrations/0003_populate_module_field.py | 41 -- .../0004_survey_result_module_non_nullable.py | 20 - summary/migrations/0005_add_verbose_name.py | 59 -- ...eyresult_unique_module_survey_statement.py | 17 - .../0007_survey_result_question_group.py | 32 -- .../migrations/0008_surveyresultfeedback.py | 34 -- ...ter_surveyresultfeedback_expected_score.py | 18 - .../0010_surveyresultfeedback_is_baseline.py | 18 - .../0011_alter_surveyresult_options.py | 17 - ...0012_alter_surveyresultfeedback_comment.py | 18 - ...sultfeedback_survey_result_one_baseline.py | 17 - support/migrations/0001_initial.py | 120 +++- support/migrations/0002_initial.py | 79 +++ .../migrations/0002_resource_resourcetag.py | 59 -- support/migrations/0003_action.py | 46 -- support/migrations/0004_action_context.py | 20 - .../migrations/0005_alter_action_options.py | 17 - support/migrations/0006_legaldocument.py | 35 -- .../0007_alter_legaldocument_document_type.py | 18 - support/migrations/0008_emailtemplate.py | 24 - support/migrations/0009_add_verbose_name.py | 345 ------------ .../0010_alter_emailtemplate_html_message.py | 19 - support/models.py | 10 +- support/serializers.py | 4 +- survey/migrations/0001_initial.py | 139 ++--- survey/migrations/0002_add_skip_logic.py | 44 -- survey/migrations/0002_initial.py | 109 ++++ survey/migrations/0003_survey_config.py | 18 - .../migrations/0004_share_survey_publicly.py | 27 - survey/migrations/0005_question_acronym.py | 18 - .../migrations/0006_alter_question_acronym.py | 18 - .../migrations/0007_multiple_image_answer.py | 23 - .../0008_image_to_single_image_migrate.py | 26 - survey/migrations/0009_remove_image_choice.py | 23 - survey/migrations/0010_add_verbose_name.py | 324 ----------- .../0011_increase_code_max_length.py | 28 - ...012_surveyanswer_unique_survey_question.py | 17 - ...ption_mitigation_opportunity_json_field.py | 25 - .../migrations/0014_questiongroup_module.py | 20 - .../0015_set_question_group_module.py | 26 - .../migrations/0016_remove_question_module.py | 24 - .../0017_json_field_blank_true_default.py | 28 - .../0018_remove_option_json_field.py | 21 - .../0019_alter_surveyanswer_options.py | 18 - survey/models.py | 6 +- survey/serializers.py | 4 +- user/migrations/0001_initial.py | 69 ++- .../0002_add_user_organization_role.py | 23 - ...r_has_accepted_terms_and_privacy_policy.py | 18 - user/migrations/0004_emailchangepin.py | 34 -- user/migrations/0005_useroldpassword.py | 28 - user/migrations/0006_add_verbose_name.py | 167 ------ uv.lock | 14 +- 107 files changed, 1262 insertions(+), 4316 deletions(-) delete mode 100644 context/migrations/0002_add_verbose_name.py create mode 100644 context/migrations/0002_initial.py delete mode 100644 context/migrations/0003_increase_code_max_length.py delete mode 100644 context/migrations/0004_module_question_completion_time.py create mode 100644 notification/migrations/0002_initial.py delete mode 100644 notification/migrations/0002_notice.py delete mode 100644 notification/migrations/0003_add_verbose_name.py create mode 100644 organization/migrations/0002_initial.py delete mode 100644 organization/migrations/0002_organization_description.py delete mode 100644 organization/migrations/0003_organization_member_request_status.py delete mode 100644 organization/migrations/0004_organization_logo.py delete mode 100644 organization/migrations/0005_organization_acronym.py delete mode 100644 organization/migrations/0006_organization_mptt.py delete mode 100644 organization/migrations/0007_organization_mptt_rebuild.py delete mode 100644 organization/migrations/0008_add_verbose_name.py delete mode 100644 project/migrations/0002_alter_project_organization.py create mode 100644 project/migrations/0002_initial.py delete mode 100644 project/migrations/0003_project_share_analytics_with_neat.py delete mode 100644 project/migrations/0004_add_verbose_name.py delete mode 100644 project/migrations/0005_fix_visibiltiy_choices_readable_name.py create mode 100644 statement/migrations/0002_initial.py delete mode 100644 statement/migrations/0002_statement_tags.py delete mode 100644 statement/migrations/0003_statement_is_experimental.py delete mode 100644 statement/migrations/0004_add_verbose_name.py delete mode 100644 statement/migrations/0005_statement_question_option_version.py delete mode 100644 statement/migrations/0006_make_initial_version_active.py delete mode 100644 statement/migrations/0007_increase_code_max_length.py delete mode 100644 statement/migrations/0008_delete_option_mitigation_opportunity.py delete mode 100644 statement/migrations/0009_statement_question_groups.py delete mode 100644 statement/migrations/0010_add_question_group_to_weightage.py delete mode 100644 statement/migrations/0011_create_statement_formula.py delete mode 100644 statement/migrations/0012_create_statement_formula_version.py delete mode 100644 statement/migrations/0013_mitigation_opportunity_multiple_statement.py delete mode 100644 statement/migrations/0014_single_statement_to_m2m.py delete mode 100644 statement/migrations/0015_add_options_field_mitigation_opportunity.py delete mode 100644 statement/migrations/0016_add_new_fields_migration_opportunity.py create mode 100644 summary/migrations/0002_initial.py delete mode 100644 summary/migrations/0002_surveyresult_module.py delete mode 100644 summary/migrations/0003_populate_module_field.py delete mode 100644 summary/migrations/0004_survey_result_module_non_nullable.py delete mode 100644 summary/migrations/0005_add_verbose_name.py delete mode 100644 summary/migrations/0006_surveyresult_unique_module_survey_statement.py delete mode 100644 summary/migrations/0007_survey_result_question_group.py delete mode 100644 summary/migrations/0008_surveyresultfeedback.py delete mode 100644 summary/migrations/0009_alter_surveyresultfeedback_expected_score.py delete mode 100644 summary/migrations/0010_surveyresultfeedback_is_baseline.py delete mode 100644 summary/migrations/0011_alter_surveyresult_options.py delete mode 100644 summary/migrations/0012_alter_surveyresultfeedback_comment.py delete mode 100644 summary/migrations/0013_surveyresultfeedback_survey_result_one_baseline.py create mode 100644 support/migrations/0002_initial.py delete mode 100644 support/migrations/0002_resource_resourcetag.py delete mode 100644 support/migrations/0003_action.py delete mode 100644 support/migrations/0004_action_context.py delete mode 100644 support/migrations/0005_alter_action_options.py delete mode 100644 support/migrations/0006_legaldocument.py delete mode 100644 support/migrations/0007_alter_legaldocument_document_type.py delete mode 100644 support/migrations/0008_emailtemplate.py delete mode 100644 support/migrations/0009_add_verbose_name.py delete mode 100644 support/migrations/0010_alter_emailtemplate_html_message.py delete mode 100644 survey/migrations/0002_add_skip_logic.py create mode 100644 survey/migrations/0002_initial.py delete mode 100644 survey/migrations/0003_survey_config.py delete mode 100644 survey/migrations/0004_share_survey_publicly.py delete mode 100644 survey/migrations/0005_question_acronym.py delete mode 100644 survey/migrations/0006_alter_question_acronym.py delete mode 100644 survey/migrations/0007_multiple_image_answer.py delete mode 100644 survey/migrations/0008_image_to_single_image_migrate.py delete mode 100644 survey/migrations/0009_remove_image_choice.py delete mode 100644 survey/migrations/0010_add_verbose_name.py delete mode 100644 survey/migrations/0011_increase_code_max_length.py delete mode 100644 survey/migrations/0012_surveyanswer_unique_survey_question.py delete mode 100644 survey/migrations/0013_option_mitigation_opportunity_json_field.py delete mode 100644 survey/migrations/0014_questiongroup_module.py delete mode 100644 survey/migrations/0015_set_question_group_module.py delete mode 100644 survey/migrations/0016_remove_question_module.py delete mode 100644 survey/migrations/0017_json_field_blank_true_default.py delete mode 100644 survey/migrations/0018_remove_option_json_field.py delete mode 100644 survey/migrations/0019_alter_surveyanswer_options.py delete mode 100644 user/migrations/0002_add_user_organization_role.py delete mode 100644 user/migrations/0003_user_has_accepted_terms_and_privacy_policy.py delete mode 100644 user/migrations/0004_emailchangepin.py delete mode 100644 user/migrations/0005_useroldpassword.py delete mode 100644 user/migrations/0006_add_verbose_name.py diff --git a/Dockerfile b/Dockerfile index d6a9f7c..0d2f30f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,9 +18,10 @@ RUN apt-get update && apt-get install --no-install-recommends -y \ ENV PYTHONUNBUFFERED=1 \ - PYTHONDONTWRITEBYTECODE=1 \ CODE_PATH="/code" \ - VENV_PATH="/code/.venv" + VENV_PATH="/code/.venv" \ + UV_COMPILE_BYTECODE=1 \ + UV_LINK_MODE=copy FROM python-base AS builder diff --git a/context/migrations/0001_initial.py b/context/migrations/0001_initial.py index e33d11c..c4fb8fb 100644 --- a/context/migrations/0001_initial.py +++ b/context/migrations/0001_initial.py @@ -1,6 +1,5 @@ -# Generated by Django 3.2 on 2021-05-20 07:32 +# Generated by Django 4.2.17 on 2025-01-14 09:53 -from django.conf import settings from django.db import migrations, models import django.db.models.deletion @@ -10,7 +9,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -18,20 +16,18 @@ class Migration(migrations.Migration): name='Context', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('code', models.CharField(max_length=10, unique=True)), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('title', models.CharField(max_length=255)), - ('title_en', models.CharField(max_length=255, null=True)), - ('title_es', models.CharField(max_length=255, null=True)), - ('title_fr', models.CharField(max_length=255, null=True)), - ('description', models.TextField()), - ('description_en', models.TextField(null=True)), - ('description_es', models.TextField(null=True)), - ('description_fr', models.TextField(null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='code')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_es', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_fr', models.CharField(max_length=255, null=True, verbose_name='title')), + ('description', models.TextField(verbose_name='description')), + ('description_en', models.TextField(null=True, verbose_name='description')), + ('description_es', models.TextField(null=True, verbose_name='description')), + ('description_fr', models.TextField(null=True, verbose_name='description')), ], options={ 'ordering': ('order',), @@ -42,21 +38,20 @@ class Migration(migrations.Migration): name='Module', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('code', models.CharField(max_length=10, unique=True)), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('title', models.CharField(max_length=255)), - ('title_en', models.CharField(max_length=255, null=True)), - ('title_es', models.CharField(max_length=255, null=True)), - ('title_fr', models.CharField(max_length=255, null=True)), - ('description', models.TextField()), - ('description_en', models.TextField(null=True)), - ('description_es', models.TextField(null=True)), - ('description_fr', models.TextField(null=True)), - ('context', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='modules', to='context.context')), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='code')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_es', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_fr', models.CharField(max_length=255, null=True, verbose_name='title')), + ('description', models.TextField(verbose_name='description')), + ('description_en', models.TextField(null=True, verbose_name='description')), + ('description_es', models.TextField(null=True, verbose_name='description')), + ('description_fr', models.TextField(null=True, verbose_name='description')), + ('question_completion_time', models.DurationField(blank=True, default=None, null=True, verbose_name='estimated time to complete question')), + ('context', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='modules', to='context.context', verbose_name='context')), ], options={ 'ordering': ('order',), diff --git a/context/migrations/0002_add_verbose_name.py b/context/migrations/0002_add_verbose_name.py deleted file mode 100644 index 98a28a9..0000000 --- a/context/migrations/0002_add_verbose_name.py +++ /dev/null @@ -1,151 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 14:40 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('context', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='context', - name='code', - field=models.CharField(max_length=10, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='context', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='context', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='context', - name='description', - field=models.TextField(verbose_name='description'), - ), - migrations.AlterField( - model_name='context', - name='description_en', - field=models.TextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='context', - name='description_es', - field=models.TextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='context', - name='description_fr', - field=models.TextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='context', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='context', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='context', - name='title_en', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='context', - name='title_es', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='context', - name='title_fr', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='context', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='module', - name='code', - field=models.CharField(max_length=10, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='module', - name='context', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='modules', to='context.context', verbose_name='context'), - ), - migrations.AlterField( - model_name='module', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='module', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='module', - name='description', - field=models.TextField(verbose_name='description'), - ), - migrations.AlterField( - model_name='module', - name='description_en', - field=models.TextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='module', - name='description_es', - field=models.TextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='module', - name='description_fr', - field=models.TextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='module', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='module', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='module', - name='title_en', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='module', - name='title_es', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='module', - name='title_fr', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='module', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - ] diff --git a/context/migrations/0002_initial.py b/context/migrations/0002_initial.py new file mode 100644 index 0000000..fff7864 --- /dev/null +++ b/context/migrations/0002_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 4.2.17 on 2025-01-14 09:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('context', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='module', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='module', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='context', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='context', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + ] diff --git a/context/migrations/0003_increase_code_max_length.py b/context/migrations/0003_increase_code_max_length.py deleted file mode 100644 index 172d555..0000000 --- a/context/migrations/0003_increase_code_max_length.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-18 04:52 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0002_add_verbose_name'), - ] - - operations = [ - migrations.AlterField( - model_name='context', - name='code', - field=models.CharField(max_length=50, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='module', - name='code', - field=models.CharField(max_length=50, unique=True, verbose_name='code'), - ), - ] diff --git a/context/migrations/0004_module_question_completion_time.py b/context/migrations/0004_module_question_completion_time.py deleted file mode 100644 index f8aab8f..0000000 --- a/context/migrations/0004_module_question_completion_time.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.17 on 2025-01-03 04:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0003_increase_code_max_length'), - ] - - operations = [ - migrations.AddField( - model_name='module', - name='question_completion_time', - field=models.DurationField(blank=True, default=None, null=True, verbose_name='estimated time to complete question'), - ), - ] diff --git a/docker/entrypoint.dev.sh b/docker/entrypoint.dev.sh index 33efd86..f6d51d4 100755 --- a/docker/entrypoint.dev.sh +++ b/docker/entrypoint.dev.sh @@ -12,6 +12,7 @@ then fi else uv run manage.py collectstatic --no-input + uv run manage.py makemigrations uv run manage.py migrate --no-input uv run manage.py import_default_email_template uv run manage.py runserver_plus 0.0.0.0:8000 || uv run manage.py runserver 0.0.0.0:8000 diff --git a/neatplus/serializers.py b/neatplus/serializers.py index aabacba..8ce2ced 100644 --- a/neatplus/serializers.py +++ b/neatplus/serializers.py @@ -1,4 +1,3 @@ -from ckeditor_uploader.fields import RichTextUploadingField from django.conf import settings from django.contrib.auth import get_user_model from django.utils.translation import gettext_lazy as _ @@ -7,8 +6,6 @@ from rest_framework.fields import CharField from rest_framework_simplejwt.serializers import TokenObtainPairSerializer -CKEDITOR_LOCATION = f"/{settings.MEDIA_LOCATION}/{settings.CKEDITOR_UPLOAD_PATH}" -ORIGINAL_TEXT = f'src="{CKEDITOR_LOCATION}' UserModel = get_user_model() @@ -48,26 +45,6 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) -class RichTextUploadingSerializerField(CharField): - def to_representation(self, value): - data = super().to_representation(value) - if not settings.USE_S3_STORAGE: - replace_text = ORIGINAL_TEXT.replace( - CKEDITOR_LOCATION, - self.context["request"].build_absolute_uri(CKEDITOR_LOCATION), - ) - data = data.replace(ORIGINAL_TEXT, replace_text) - return data - - -class RichTextUploadingModelSerializer(serializers.ModelSerializer): - def __init__(self, *args, **kwargs): - self.serializer_field_mapping[RichTextUploadingField] = ( - RichTextUploadingSerializerField - ) - super().__init__(*args, **kwargs) - - class TokenObtainPairDefenderSerializer(TokenObtainPairSerializer): def validate(self, attrs): from defender import config as defender_config diff --git a/neatplus/settings.py b/neatplus/settings.py index 417d38a..4e65f71 100644 --- a/neatplus/settings.py +++ b/neatplus/settings.py @@ -83,7 +83,7 @@ "summary", "support", "survey", - "user", + "user" ] # Third party apps @@ -96,8 +96,6 @@ "corsheaders", "ordered_model", "drf_spectacular", - "ckeditor", - "ckeditor_uploader", "rest_framework_gis", "admin_auto_filters", "drf_recaptcha", @@ -105,6 +103,7 @@ "oauth2_provider", "defender", "reversion", + "django_ckeditor_5" ] INSTALLED_APPS = BEFORE_DJANGO_APPS + DJANGO_APPS + INTERNAL_APPS + THIRD_PARTY_APPS @@ -307,13 +306,24 @@ AWS_S3_REGION_NAME = env.str("AWS_S3_REGION_NAME") AWS_S3_SIGNATURE_VERSION = "s3v4" + + AWS_S3_FILE_OVERWRITE = True + #AWS_DEFAULT_ACL = None + USE_CLOUDFRONT_CDN = env.bool("USE_CLOUDFRONT_CDN", default=False) if USE_CLOUDFRONT_CDN: AWS_S3_CUSTOM_DOMAIN = env.str("CLOUDFRONT_CDN_URL") - UPLOAD_STATIC_TO_S3 = env.bool("UPLOAD_STATIC_TO_S3", default=True) + else: + AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com' + + UPLOAD_STATIC_TO_S3 = env.bool("UPLOAD_STATIC_TO_S3", default=False) # s3 media settings DEFAULT_FILE_STORAGE = "neatplus.storage_backends.MediaStorage" # s3 static settings + UPLOAD_MEDIA_TO_S3 = env.bool("UPLOAD_MEDIA_TO_S3", default=False) + if UPLOAD_MEDIA_TO_S3: + MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{MEDIA_LOCATION}/' + if UPLOAD_STATIC_TO_S3: STATICFILES_STORAGE = "neatplus.storage_backends.StaticStorage" else: @@ -454,143 +464,78 @@ "CAMELIZE_NAMES": True, } -# CKEDITOR settings -CKEDITOR_UPLOAD_PATH = "ckeditor-uploads/" -CKEDITOR_IMAGE_BACKEND = "pillow" -if USE_S3_STORAGE: - CKEDITOR_STORAGE_BACKEND = "neatplus.storage_backends.CKEditorStorage" -CKEDITOR_ALLOW_NONIMAGE_FILES = False -CKEDITOR_CONFIGS = { - "default": { - "toolbar_CustomToolbarConfig": [ - { - "name": "document", - "items": [ - "Source", - "-", - "Save", - "NewPage", - "Preview", - "Print", - "-", - "Templates", - ], - }, - { - "name": "clipboard", - "items": [ - "Cut", - "Copy", - "Paste", - "PasteText", - "PasteFromWord", - "-", - "Undo", - "Redo", - ], - }, - { - "name": "editing", - "items": ["Find", "Replace", "-", "SelectAll", "-", "Scayt"], - }, - { - "name": "forms", - "items": [ - "Form", - "Checkbox", - "Radio", - "TextField", - "Textarea", - "Select", - "Button", - "ImageButton", - "HiddenField", - ], - }, - "/", - { - "name": "basicstyles", - "items": [ - "Bold", - "Italic", - "Underline", - "Strike", - "Subscript", - "Superscript", - "-", - "CopyFormatting", - "RemoveFormat", - ], - }, - { - "name": "paragraph", - "items": [ - "NumberedList", - "BulletedList", - "-", - "Outdent", - "Indent", - "-", - "Blockquote", - "CreateDiv", - "-", - "JustifyLeft", - "JustifyCenter", - "JustifyRight", - "JustifyBlock", - "-", - "BidiLtr", - "BidiRtl", - "Language", - ], - }, - {"name": "links", "items": ["Link", "Unlink", "Anchor"]}, - { - "name": "insert", - "items": [ - "Image", - "Flash", - "Table", - "HorizontalRule", - "Smiley", - "SpecialChar", - "PageBreak", - "Iframe", - ], - }, - "/", - {"name": "styles", "items": ["Styles", "Format", "Font", "FontSize"]}, - {"name": "colors", "items": ["TextColor", "BGColor"]}, - {"name": "tools", "items": ["Maximize", "ShowBlocks"]}, - {"name": "about", "items": ["About"]}, - "/", - {"name": "embeding_tools", "items": ["Embed", "Mathjax", "CodeSnippet"]}, - ], - "toolbar": "CustomToolbarConfig", - "mathJaxLib": "//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML", - "tabSpaces": 4, - "extraPlugins": ",".join( - [ - "uploadimage", - "div", - "autolink", - "autoembed", - "embedsemantic", - "autogrow", - "widget", - "lineutils", - "clipboard", - "dialog", - "dialogui", - "elementspath", - "mathjax", - "embed", - "codesnippet", +# All CKEditor5 Configs + +# This field will redirect to a custom view that is written for file upload +# The view must be present in one of the urls mentioned in urls.py file +CK_EDITOR_5_UPLOAD_FILE_VIEW_NAME = "ckeditor_file_upload_view" +CKEDITOR_5_MAX_FILE_SIZE = 10 +customColorPalette = [ + { + 'color': 'hsl(4, 90%, 58%)', + 'label': 'Red' + }, + { + 'color': 'hsl(340, 82%, 52%)', + 'label': 'Pink' + }, + { + 'color': 'hsl(291, 64%, 42%)', + 'label': 'Purple' + }, + { + 'color': 'hsl(262, 52%, 47%)', + 'label': 'Deep Purple' + }, + { + 'color': 'hsl(231, 48%, 48%)', + 'label': 'Indigo' + }, + { + 'color': 'hsl(207, 90%, 54%)', + 'label': 'Blue' + }, + ] + +CKEDITOR_5_FILE_STORAGE = DEFAULT_FILE_STORAGE if USE_S3_STORAGE else 'django.core.files.storage.FileSystemStorage' + +CKEDITOR_5_CONFIGS = { + 'default': { + 'toolbar': { + 'toolbar_panel_id': 'toolbar', + 'toolbar_width': '100%', + 'items': [ + 'undo', 'redo', '|', + 'heading', '|', + 'bold', 'italic', 'underline', 'strikethrough', '|', + 'alignment', 'fontFamily', 'fontColor', 'fontBackgroundColor', '|', + 'link', 'imageUpload', 'mediaEmbed', 'fileUpload', '|', + 'bulletedList', 'numberedList', 'todoList', '|', + 'blockQuote', 'insertTable', 'codeBlock', 'code', '|', + 'findAndReplace', 'highlight', 'removeFormat' + ], + 'shouldNotGroupWhenFull': True + }, + 'language': 'en', # set any language you want + 'image': { + 'toolbar': [ + 'imageTextAlternative', 'imageStyle:full', 'imageStyle:side' ] - ), + }, + 'table': { + 'contentToolbar': ['tableColumn', 'tableRow', 'mergeTableCells'] + }, + 'placeholder': 'Enter Your Text...', + } } +CKEDITOR_5_UPLOAD_FILE_TYPES = ['jpeg', 'pdf', 'png', 'jpg', 'docx', '.xlsx'] +# Define a constant in settings.py to specify file upload permissions +CKEDITOR_5_FILE_UPLOAD_PERMISSION = "staff" # Possible values: "staff", "authenticated", "any" + + + # Bakery custom baker class BAKER_CUSTOM_CLASS = "neatplus.bakery.UserStampedBaker" @@ -634,3 +579,5 @@ # Path of gdal and geos GDAL_LIBRARY_PATH = env.str("GDAL_LIBRARY_PATH", default=None) GEOS_LIBRARY_PATH = env.str("GEOS_LIBRARY_PATH", default=None) + +MODELTRANSLATION_CUSTOM_FIELDS=("CKEditor5Field") diff --git a/neatplus/storage_backends.py b/neatplus/storage_backends.py index d7480b3..29dd33f 100644 --- a/neatplus/storage_backends.py +++ b/neatplus/storage_backends.py @@ -13,8 +13,3 @@ class MediaStorage(S3Boto3Storage): file_overwrite = False -class CKEditorStorage(S3Boto3Storage): - location = settings.MEDIA_LOCATION - default_acl = "public-read" - querystring_auth = False - file_overwrite = False diff --git a/neatplus/tests/__init__.py b/neatplus/tests/__init__.py index 2097610..012dbb9 100644 --- a/neatplus/tests/__init__.py +++ b/neatplus/tests/__init__.py @@ -13,10 +13,7 @@ class FullTestCase(APITestCase, APILiveServerTestCase): baker.generators.add("neatplus.fields.LowerCharField", random_gen.gen_string) baker.generators.add("neatplus.fields.LowerEmailField", random_gen.gen_email) baker.generators.add("neatplus.fields.LowerTextField", random_gen.gen_text) - baker.generators.add("ckeditor.fields.RichTextField", random_gen.gen_text) - baker.generators.add( - "ckeditor_uploader.fields.RichTextUploadingField", random_gen.gen_text - ) + baker.generators.add("django_ckeditor_5.fields.CKEditor5Field", random_gen.gen_text) baker.generators.add( "django.contrib.gis.db.models.fields.PointField", random_gen.gen_point ) diff --git a/neatplus/urls.py b/neatplus/urls.py index 47388c5..7c3e358 100644 --- a/neatplus/urls.py +++ b/neatplus/urls.py @@ -52,6 +52,8 @@ ) from user.views import UserViewSet +from .views import ckeditor_file_upload_view + API_VERSION = "v1" @@ -129,6 +131,11 @@ class OTPAdmin(OTPAdminSite): path("admin/", admin.site.urls), prefix_default_language=False ) +# url for ckeditor5 custom file handling view +urlpatterns += [ + path('file_upload/', ckeditor_file_upload_view, name='ckeditor_file_upload_view'), +] + urlpatterns += [ # DRF router re_path(get_api_path(""), include(router.urls)), @@ -154,7 +161,6 @@ class OTPAdmin(OTPAdminSite): path( "schema/redoc/", SpectacularRedocView.as_view(url_name="schema"), name="redoc" ), - path("ckeditor/", include("ckeditor_uploader.urls")), # Oauth path("oauth/", include("oauth2_provider.urls", namespace="oauth2_provider")), # API diff --git a/neatplus/views.py b/neatplus/views.py index 0ba8904..f15ac8d 100644 --- a/neatplus/views.py +++ b/neatplus/views.py @@ -1,5 +1,11 @@ from rest_flex_fields import EXPAND_PARAM, WILDCARD_VALUES +# modules for custom file upload handling +from django.core.files.storage import default_storage +from django.http import JsonResponse +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status class UserStampedModelCreateMixin: def perform_create(self, serializer): @@ -31,3 +37,24 @@ def fetch_related_objects(self, queryset): if field in expand_params or wildcard_present: queryset = queryset.select_related(field) return queryset + + + +def ckeditor_file_upload_view(request): + if request.method == "POST" and 'upload' in request.FILES: + # Retrieve the uploaded file + uploaded_file = request.FILES['upload'] + file_path = default_storage.save(f"ckeditor/{uploaded_file.name}", uploaded_file) + file_url = default_storage.url(file_path) + + # Return the JSON response with the file URL + return JsonResponse({ + "url": file_url, + "message": "File uploaded successfully!", + }) + + # If no file is uploaded or the request method is not POST + return JsonResponse({ + "error": "No file uploaded or invalid request method.", + }, status=400) + diff --git a/notification/migrations/0001_initial.py b/notification/migrations/0001_initial.py index 03af8b2..33fd0de 100644 --- a/notification/migrations/0001_initial.py +++ b/notification/migrations/0001_initial.py @@ -1,9 +1,9 @@ -# Generated by Django 3.2 on 2021-05-13 10:57 +# Generated by Django 4.2.17 on 2025-01-14 09:53 -from django.conf import settings from django.db import migrations, models import django.db.models.deletion import django.utils.timezone +import django_ckeditor_5.fields class Migration(migrations.Migration): @@ -11,29 +11,41 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('contenttypes', '0002_remove_content_type_name'), ] operations = [ + migrations.CreateModel( + name='Notice', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('description', django_ckeditor_5.fields.CKEditor5Field(blank=True, default=None, null=True, verbose_name='description')), + ('notice_type', models.CharField(choices=[('user', 'User'), ('public', 'Public')], default='public', max_length=6, verbose_name='notice type')), + ('is_active', models.BooleanField(default=True, verbose_name='active')), + ], + options={ + 'abstract': False, + }, + ), migrations.CreateModel( name='Notification', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('actor_object_id', models.PositiveIntegerField(blank=True, null=True)), - ('verb', models.CharField(max_length=100)), - ('description', models.TextField()), - ('notification_type', models.CharField(default='default', max_length=50)), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('action_object_object_id', models.PositiveIntegerField(blank=True, null=True)), - ('target_object_id', models.PositiveIntegerField(blank=True, null=True)), - ('has_read', models.BooleanField(default=False, editable=False)), - ('action_object_content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notify_action_object', to='contenttypes.contenttype')), - ('actor_content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notify_actor', to='contenttypes.contenttype')), - ('recipient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL)), - ('target_content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notify_target', to='contenttypes.contenttype')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('actor_object_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='actor object id')), + ('verb', models.CharField(max_length=100, verbose_name='verb')), + ('description', models.TextField(verbose_name='description')), + ('notification_type', models.CharField(default='default', max_length=50, verbose_name='notification type')), + ('timestamp', models.DateTimeField(default=django.utils.timezone.now, verbose_name='timestamp')), + ('action_object_object_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='action object object id')), + ('target_object_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='target object id')), + ('has_read', models.BooleanField(default=False, editable=False, verbose_name='read')), + ('action_object_content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notify_action_object', to='contenttypes.contenttype', verbose_name='action object content type')), + ('actor_content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notify_actor', to='contenttypes.contenttype', verbose_name='actor content type')), ], options={ 'ordering': ('-created_at',), diff --git a/notification/migrations/0002_initial.py b/notification/migrations/0002_initial.py new file mode 100644 index 0000000..a2a4927 --- /dev/null +++ b/notification/migrations/0002_initial.py @@ -0,0 +1,39 @@ +# Generated by Django 4.2.17 on 2025-01-14 09:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0002_remove_content_type_name'), + ('notification', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='notification', + name='recipient', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL, verbose_name='recipient'), + ), + migrations.AddField( + model_name='notification', + name='target_content_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notify_target', to='contenttypes.contenttype', verbose_name='target content type'), + ), + migrations.AddField( + model_name='notice', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='notice', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + ] diff --git a/notification/migrations/0002_notice.py b/notification/migrations/0002_notice.py deleted file mode 100644 index faa0a7c..0000000 --- a/notification/migrations/0002_notice.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 3.2.5 on 2021-07-06 09:38 - -import ckeditor.fields -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('notification', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Notice', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=255)), - ('description', ckeditor.fields.RichTextField(blank=True, default=None, null=True)), - ('notice_type', models.CharField(choices=[('user', 'User'), ('public', 'Public')], default='public', max_length=6)), - ('is_active', models.BooleanField(default=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/notification/migrations/0003_add_verbose_name.py b/notification/migrations/0003_add_verbose_name.py deleted file mode 100644 index f395608..0000000 --- a/notification/migrations/0003_add_verbose_name.py +++ /dev/null @@ -1,129 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 14:40 - -import ckeditor.fields -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('contenttypes', '0002_remove_content_type_name'), - ('notification', '0002_notice'), - ] - - operations = [ - migrations.AlterField( - model_name='notice', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='notice', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='notice', - name='description', - field=ckeditor.fields.RichTextField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='notice', - name='is_active', - field=models.BooleanField(default=True, verbose_name='active'), - ), - migrations.AlterField( - model_name='notice', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='notice', - name='notice_type', - field=models.CharField(choices=[('user', 'User'), ('public', 'Public')], default='public', max_length=6, verbose_name='notice type'), - ), - migrations.AlterField( - model_name='notice', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='notice', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='notification', - name='action_object_content_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notify_action_object', to='contenttypes.contenttype', verbose_name='action object content type'), - ), - migrations.AlterField( - model_name='notification', - name='action_object_object_id', - field=models.PositiveIntegerField(blank=True, null=True, verbose_name='action object object id'), - ), - migrations.AlterField( - model_name='notification', - name='actor_content_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notify_actor', to='contenttypes.contenttype', verbose_name='actor content type'), - ), - migrations.AlterField( - model_name='notification', - name='actor_object_id', - field=models.PositiveIntegerField(blank=True, null=True, verbose_name='actor object id'), - ), - migrations.AlterField( - model_name='notification', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='notification', - name='description', - field=models.TextField(verbose_name='description'), - ), - migrations.AlterField( - model_name='notification', - name='has_read', - field=models.BooleanField(default=False, editable=False, verbose_name='read'), - ), - migrations.AlterField( - model_name='notification', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='notification', - name='notification_type', - field=models.CharField(default='default', max_length=50, verbose_name='notification type'), - ), - migrations.AlterField( - model_name='notification', - name='recipient', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL, verbose_name='recipient'), - ), - migrations.AlterField( - model_name='notification', - name='target_content_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notify_target', to='contenttypes.contenttype', verbose_name='target content type'), - ), - migrations.AlterField( - model_name='notification', - name='target_object_id', - field=models.PositiveIntegerField(blank=True, null=True, verbose_name='target object id'), - ), - migrations.AlterField( - model_name='notification', - name='timestamp', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='timestamp'), - ), - migrations.AlterField( - model_name='notification', - name='verb', - field=models.CharField(max_length=100, verbose_name='verb'), - ), - ] diff --git a/notification/models.py b/notification/models.py index 2de1ed9..5ee4b80 100644 --- a/notification/models.py +++ b/notification/models.py @@ -1,4 +1,4 @@ -from ckeditor.fields import RichTextField +from django_ckeditor_5.fields import CKEditor5Field from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType @@ -80,7 +80,7 @@ class NoticeTypeChoice(models.TextChoices): PUBLIC = "public", _("Public") title = models.CharField(_("title"), max_length=255) - description = RichTextField(_("description"), blank=True, null=True, default=None) + description = CKEditor5Field(_("description"), blank=True, null=True, default=None) notice_type = models.CharField( _("notice type"), max_length=6, diff --git a/organization/migrations/0001_initial.py b/organization/migrations/0001_initial.py index f92a4db..fcde618 100644 --- a/organization/migrations/0001_initial.py +++ b/organization/migrations/0001_initial.py @@ -1,8 +1,6 @@ -# Generated by Django 3.2 on 2021-05-20 06:12 +# Generated by Django 4.2.17 on 2025-01-14 09:53 -from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): @@ -10,7 +8,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -18,13 +15,30 @@ class Migration(migrations.Migration): name='Organization', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=255, unique=True)), - ('admins', models.ManyToManyField(related_name='admin_organizations', to=settings.AUTH_USER_MODEL)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('members', models.ManyToManyField(related_name='member_organizations', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('title', models.CharField(max_length=255, unique=True, verbose_name='title')), + ('acronym', models.CharField(blank=True, default=None, max_length=50, null=True, verbose_name='acronym')), + ('description', models.TextField(blank=True, default=None, null=True, verbose_name='description')), + ('logo', models.ImageField(blank=True, default=None, null=True, upload_to='organization/organization/logos', verbose_name='logo')), + ('status', models.CharField(choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='pending', editable=False, max_length=8, verbose_name='status')), + ('point_of_contact', models.TextField(blank=True, default=None, null=True, verbose_name='point of contact')), + ('lft', models.PositiveIntegerField(editable=False)), + ('rght', models.PositiveIntegerField(editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(editable=False)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='OrganizationMemberRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('status', models.CharField(choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='pending', editable=False, max_length=8, verbose_name='status')), ], options={ 'abstract': False, diff --git a/organization/migrations/0002_initial.py b/organization/migrations/0002_initial.py new file mode 100644 index 0000000..1a25c32 --- /dev/null +++ b/organization/migrations/0002_initial.py @@ -0,0 +1,64 @@ +# Generated by Django 4.2.17 on 2025-01-14 09:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import mptt.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('organization', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='organizationmemberrequest', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='organizationmemberrequest', + name='organization', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='member_requests', to='organization.organization', verbose_name='organization'), + ), + migrations.AddField( + model_name='organizationmemberrequest', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='organizationmemberrequest', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='member_requests', to=settings.AUTH_USER_MODEL, verbose_name='user'), + ), + migrations.AddField( + model_name='organization', + name='admins', + field=models.ManyToManyField(related_name='admin_organizations', to=settings.AUTH_USER_MODEL, verbose_name='admins'), + ), + migrations.AddField( + model_name='organization', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='organization', + name='members', + field=models.ManyToManyField(blank=True, related_name='member_organizations', to=settings.AUTH_USER_MODEL, verbose_name='members'), + ), + migrations.AddField( + model_name='organization', + name='parent', + field=mptt.fields.TreeForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='childerns', to='organization.organization', verbose_name='organization parent'), + ), + migrations.AddField( + model_name='organization', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + ] diff --git a/organization/migrations/0002_organization_description.py b/organization/migrations/0002_organization_description.py deleted file mode 100644 index ca8a510..0000000 --- a/organization/migrations/0002_organization_description.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 3.2.4 on 2021-06-22 06:49 - -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('organization', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='organization', - name='description', - field=models.TextField(blank=True, default=None, null=True), - ), - migrations.AlterField( - model_name='organization', - name='members', - field=models.ManyToManyField(blank=True, related_name='member_organizations', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/organization/migrations/0003_organization_member_request_status.py b/organization/migrations/0003_organization_member_request_status.py deleted file mode 100644 index 2e7230b..0000000 --- a/organization/migrations/0003_organization_member_request_status.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 3.2.4 on 2021-06-28 06:26 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('organization', '0002_organization_description'), - ] - - operations = [ - migrations.AddField( - model_name='organization', - name='point_of_contact', - field=models.TextField(blank=True, default=None, null=True), - ), - migrations.AddField( - model_name='organization', - name='status', - field=models.CharField(choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='pending', editable=False, max_length=8), - ), - migrations.CreateModel( - name='OrganizationMemberRequest', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('status', models.CharField(choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='pending', editable=False, max_length=8)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('organization', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='member_requests', to='organization.organization')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='member_requests', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/organization/migrations/0004_organization_logo.py b/organization/migrations/0004_organization_logo.py deleted file mode 100644 index fef451e..0000000 --- a/organization/migrations/0004_organization_logo.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2021-06-29 06:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization', '0003_organization_member_request_status'), - ] - - operations = [ - migrations.AddField( - model_name='organization', - name='logo', - field=models.ImageField(blank=True, default=None, null=True, upload_to='organization/organization/logos'), - ), - ] diff --git a/organization/migrations/0005_organization_acronym.py b/organization/migrations/0005_organization_acronym.py deleted file mode 100644 index f73a583..0000000 --- a/organization/migrations/0005_organization_acronym.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2021-07-01 10:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization', '0004_organization_logo'), - ] - - operations = [ - migrations.AddField( - model_name='organization', - name='acronym', - field=models.CharField(blank=True, default=None, max_length=50, null=True), - ), - ] diff --git a/organization/migrations/0006_organization_mptt.py b/organization/migrations/0006_organization_mptt.py deleted file mode 100644 index 9412ac9..0000000 --- a/organization/migrations/0006_organization_mptt.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 11:13 - -from django.db import migrations, models -import django.db.models.deletion -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization', '0005_organization_acronym'), - ] - - operations = [ - migrations.AddField( - model_name='organization', - name='level', - field=models.PositiveIntegerField(default=0, editable=False), - preserve_default=False, - ), - migrations.AddField( - model_name='organization', - name='lft', - field=models.PositiveIntegerField(default=0, editable=False), - preserve_default=False, - ), - migrations.AddField( - model_name='organization', - name='parent', - field=mptt.fields.TreeForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='childerns', to='organization.organization'), - ), - migrations.AddField( - model_name='organization', - name='rght', - field=models.PositiveIntegerField(default=0, editable=False), - preserve_default=False, - ), - migrations.AddField( - model_name='organization', - name='tree_id', - field=models.PositiveIntegerField(db_index=True, default=0, editable=False), - preserve_default=False, - ), - ] diff --git a/organization/migrations/0007_organization_mptt_rebuild.py b/organization/migrations/0007_organization_mptt_rebuild.py deleted file mode 100644 index f2c39b3..0000000 --- a/organization/migrations/0007_organization_mptt_rebuild.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 11:26 - -from django.db import migrations -from mptt import register, managers - -def forward_migration(apps, schema_editor): - Organization = apps.get_model('organization', 'Organization') - - manager = managers.TreeManager() - manager.model = Organization - - register(Organization) - - manager.contribute_to_class(Organization, 'objects') - manager.rebuild() - -class Migration(migrations.Migration): - - dependencies = [ - ('organization', '0006_organization_mptt'), - ] - - operations = [ - migrations.RunPython(forward_migration, migrations.RunPython.noop) - ] diff --git a/organization/migrations/0008_add_verbose_name.py b/organization/migrations/0008_add_verbose_name.py deleted file mode 100644 index d7d37d0..0000000 --- a/organization/migrations/0008_add_verbose_name.py +++ /dev/null @@ -1,117 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 14:40 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('organization', '0007_organization_mptt_rebuild'), - ] - - operations = [ - migrations.AlterField( - model_name='organization', - name='acronym', - field=models.CharField(blank=True, default=None, max_length=50, null=True, verbose_name='acronym'), - ), - migrations.AlterField( - model_name='organization', - name='admins', - field=models.ManyToManyField(related_name='admin_organizations', to=settings.AUTH_USER_MODEL, verbose_name='admins'), - ), - migrations.AlterField( - model_name='organization', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='organization', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='organization', - name='description', - field=models.TextField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='organization', - name='logo', - field=models.ImageField(blank=True, default=None, null=True, upload_to='organization/organization/logos', verbose_name='logo'), - ), - migrations.AlterField( - model_name='organization', - name='members', - field=models.ManyToManyField(blank=True, related_name='member_organizations', to=settings.AUTH_USER_MODEL, verbose_name='members'), - ), - migrations.AlterField( - model_name='organization', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='organization', - name='parent', - field=mptt.fields.TreeForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='childerns', to='organization.organization', verbose_name='organization parent'), - ), - migrations.AlterField( - model_name='organization', - name='point_of_contact', - field=models.TextField(blank=True, default=None, null=True, verbose_name='point of contact'), - ), - migrations.AlterField( - model_name='organization', - name='status', - field=models.CharField(choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='pending', editable=False, max_length=8, verbose_name='status'), - ), - migrations.AlterField( - model_name='organization', - name='title', - field=models.CharField(max_length=255, unique=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='organization', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='organizationmemberrequest', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='organizationmemberrequest', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='organizationmemberrequest', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='organizationmemberrequest', - name='organization', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='member_requests', to='organization.organization', verbose_name='organization'), - ), - migrations.AlterField( - model_name='organizationmemberrequest', - name='status', - field=models.CharField(choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='pending', editable=False, max_length=8, verbose_name='status'), - ), - migrations.AlterField( - model_name='organizationmemberrequest', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='organizationmemberrequest', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='member_requests', to=settings.AUTH_USER_MODEL, verbose_name='user'), - ), - ] diff --git a/project/migrations/0001_initial.py b/project/migrations/0001_initial.py index e0b4035..3009f4a 100644 --- a/project/migrations/0001_initial.py +++ b/project/migrations/0001_initial.py @@ -1,8 +1,6 @@ -# Generated by Django 3.2 on 2021-05-20 07:32 +# Generated by Django 4.2.17 on 2025-01-14 09:53 -from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): @@ -10,9 +8,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('context', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('organization', '0001_initial'), ] operations = [ @@ -20,17 +15,14 @@ class Migration(migrations.Migration): name='Project', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('title', models.CharField(max_length=255)), - ('description', models.TextField()), - ('visibility', models.CharField(choices=[('public', 'Public'), ('public_within_organization', 'Public Wiithin Organization'), ('private', 'Private')], max_length=26)), - ('status', models.CharField(choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='pending', editable=False, max_length=8)), - ('context', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='context.context')), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('organization', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='organization.organization')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('description', models.TextField(verbose_name='description')), + ('visibility', models.CharField(choices=[('public', 'Public'), ('public_within_organization', 'Public Within Organization'), ('private', 'Private')], max_length=26, verbose_name='visibility')), + ('status', models.CharField(choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='pending', editable=False, max_length=8, verbose_name='status')), + ('share_analytics_with_neat', models.BooleanField(default=False, verbose_name='share analytics with NEAT')), ], options={ 'ordering': ('order',), @@ -41,21 +33,12 @@ class Migration(migrations.Migration): name='ProjectUser', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('permission', models.CharField(choices=[('write', 'Write'), ('read_only', 'Read Only')], default='read_only', max_length=9)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.project')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('permission', models.CharField(choices=[('write', 'Write'), ('read_only', 'Read Only')], default='read_only', max_length=9, verbose_name='permission')), ], options={ 'abstract': False, }, ), - migrations.AddField( - model_name='project', - name='users', - field=models.ManyToManyField(related_name='projects', through='project.ProjectUser', to=settings.AUTH_USER_MODEL), - ), ] diff --git a/project/migrations/0002_alter_project_organization.py b/project/migrations/0002_alter_project_organization.py deleted file mode 100644 index 0849263..0000000 --- a/project/migrations/0002_alter_project_organization.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2021-06-29 05:14 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization', '0003_organization_member_request_status'), - ('project', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='project', - name='organization', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='organization.organization'), - ), - ] diff --git a/project/migrations/0002_initial.py b/project/migrations/0002_initial.py new file mode 100644 index 0000000..fedfc88 --- /dev/null +++ b/project/migrations/0002_initial.py @@ -0,0 +1,65 @@ +# Generated by Django 4.2.17 on 2025-01-14 09:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('organization', '0002_initial'), + ('project', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('context', '0002_initial'), + ] + + operations = [ + migrations.AddField( + model_name='projectuser', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='projectuser', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.project', verbose_name='project'), + ), + migrations.AddField( + model_name='projectuser', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='projectuser', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user'), + ), + migrations.AddField( + model_name='project', + name='context', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='context.context', verbose_name='context'), + ), + migrations.AddField( + model_name='project', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='project', + name='organization', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='organization.organization', verbose_name='organization'), + ), + migrations.AddField( + model_name='project', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='project', + name='users', + field=models.ManyToManyField(related_name='projects', through='project.ProjectUser', to=settings.AUTH_USER_MODEL, verbose_name='users'), + ), + ] diff --git a/project/migrations/0003_project_share_analytics_with_neat.py b/project/migrations/0003_project_share_analytics_with_neat.py deleted file mode 100644 index 2bb83e6..0000000 --- a/project/migrations/0003_project_share_analytics_with_neat.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.5 on 2021-07-26 05:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('project', '0002_alter_project_organization'), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='share_analytics_with_neat', - field=models.BooleanField(default=False), - ), - ] diff --git a/project/migrations/0004_add_verbose_name.py b/project/migrations/0004_add_verbose_name.py deleted file mode 100644 index 0246cdc..0000000 --- a/project/migrations/0004_add_verbose_name.py +++ /dev/null @@ -1,113 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 14:40 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0002_add_verbose_name'), - ('organization', '0008_add_verbose_name'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('project', '0003_project_share_analytics_with_neat'), - ] - - operations = [ - migrations.AlterField( - model_name='project', - name='context', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='context.context', verbose_name='context'), - ), - migrations.AlterField( - model_name='project', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='project', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='project', - name='description', - field=models.TextField(verbose_name='description'), - ), - migrations.AlterField( - model_name='project', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='project', - name='organization', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='organization.organization', verbose_name='organization'), - ), - migrations.AlterField( - model_name='project', - name='share_analytics_with_neat', - field=models.BooleanField(default=False, verbose_name='share analytics with NEAT'), - ), - migrations.AlterField( - model_name='project', - name='status', - field=models.CharField(choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='pending', editable=False, max_length=8, verbose_name='status'), - ), - migrations.AlterField( - model_name='project', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='project', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='project', - name='users', - field=models.ManyToManyField(related_name='projects', through='project.ProjectUser', to=settings.AUTH_USER_MODEL, verbose_name='users'), - ), - migrations.AlterField( - model_name='project', - name='visibility', - field=models.CharField(choices=[('public', 'Public'), ('public_within_organization', 'Public Wiithin Organization'), ('private', 'Private')], max_length=26, verbose_name='visibility'), - ), - migrations.AlterField( - model_name='projectuser', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='projectuser', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='projectuser', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='projectuser', - name='permission', - field=models.CharField(choices=[('write', 'Write'), ('read_only', 'Read Only')], default='read_only', max_length=9, verbose_name='permission'), - ), - migrations.AlterField( - model_name='projectuser', - name='project', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.project', verbose_name='project'), - ), - migrations.AlterField( - model_name='projectuser', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='projectuser', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user'), - ), - ] diff --git a/project/migrations/0005_fix_visibiltiy_choices_readable_name.py b/project/migrations/0005_fix_visibiltiy_choices_readable_name.py deleted file mode 100644 index 887cfde..0000000 --- a/project/migrations/0005_fix_visibiltiy_choices_readable_name.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-16 05:58 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('project', '0004_add_verbose_name'), - ] - - operations = [ - migrations.AlterField( - model_name='project', - name='visibility', - field=models.CharField(choices=[('public', 'Public'), ('public_within_organization', 'Public Within Organization'), ('private', 'Private')], max_length=26, verbose_name='visibility'), - ), - ] diff --git a/pyproject.toml b/pyproject.toml index 3dfc272..11b0ecc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ dependencies = [ "django>=4.2.16,<5.0.0", "django-admin-autocomplete-filter>=0.7.1,<0.8.0", "django-admin-interface>=0.29.2,<0.30.0", - "django-ckeditor>=6.7.1,<7.0.0", + "django-ckeditor-5>=0.2.15", "django-cors-headers>=4.6.0,<5.0.0", "django-defender>=0.9.8,<0.10", "django-filter>=24.3,<25.0", diff --git a/statement/migrations/0001_initial.py b/statement/migrations/0001_initial.py index 4d61f9d..8f85cb9 100644 --- a/statement/migrations/0001_initial.py +++ b/statement/migrations/0001_initial.py @@ -1,6 +1,5 @@ -# Generated by Django 3.2.4 on 2021-06-24 07:12 +# Generated by Django 4.2.17 on 2025-01-14 09:53 -from django.conf import settings import django.core.validators from django.db import migrations, models import django.db.models.deletion @@ -11,8 +10,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('survey', '0002_add_skip_logic'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('context', '0001_initial'), ] @@ -22,14 +19,16 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('code', models.CharField(max_length=10, unique=True)), - ('title', models.TextField()), - ('title_en', models.TextField(null=True)), - ('title_es', models.TextField(null=True)), - ('title_fr', models.TextField(null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='code')), + ('title', models.TextField(verbose_name='title')), + ('title_en', models.TextField(null=True, verbose_name='title')), + ('title_es', models.TextField(null=True, verbose_name='title')), + ('title_fr', models.TextField(null=True, verbose_name='title')), + ('priority', models.CharField(blank=True, choices=[('high', 'High'), ('medium', 'Medium'), ('low', 'Low')], default=None, max_length=6, null=True, verbose_name='priority')), + ('implementor', models.CharField(blank=True, choices=[('local', 'Local'), ('regional', 'Regional'), ('hq', 'HQ'), ('all', 'All')], default=None, max_length=8, null=True, verbose_name='implementor')), + ('rank', models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='rank')), ], options={ 'ordering': ('order',), @@ -41,17 +40,19 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('code', models.CharField(max_length=10, unique=True)), - ('title', models.TextField()), - ('title_en', models.TextField(null=True)), - ('title_es', models.TextField(null=True)), - ('title_fr', models.TextField(null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='code')), + ('title', models.TextField(verbose_name='title')), + ('title_en', models.TextField(null=True, verbose_name='title')), + ('title_es', models.TextField(null=True, verbose_name='title')), + ('title_fr', models.TextField(null=True, verbose_name='title')), + ('priority', models.CharField(blank=True, choices=[('high', 'High'), ('medium', 'Medium'), ('low', 'Low')], default=None, max_length=6, null=True, verbose_name='priority')), + ('implementor', models.CharField(blank=True, choices=[('local', 'Local'), ('regional', 'Regional'), ('hq', 'HQ'), ('all', 'All')], default=None, max_length=8, null=True, verbose_name='implementor')), + ('rank', models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='rank')), ], options={ - 'verbose_name_plural': 'Opportunities', + 'verbose_name_plural': 'opportunities', 'ordering': ('order',), 'abstract': False, }, @@ -61,11 +62,11 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('weightage', models.FloatField()), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('option', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.option')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('weightage', models.FloatField(verbose_name='weightage')), + ('version', models.CharField(max_length=255, verbose_name='version')), + ('is_active', models.BooleanField(default=False, editable=False, verbose_name='active')), ], options={ 'ordering': ('order',), @@ -77,11 +78,11 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('weightage', models.FloatField()), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.question')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('weightage', models.FloatField(verbose_name='weightage')), + ('version', models.CharField(max_length=255, verbose_name='version')), + ('is_active', models.BooleanField(default=False, editable=False, verbose_name='active')), ], options={ 'ordering': ('order',), @@ -89,25 +90,22 @@ class Migration(migrations.Migration): }, ), migrations.CreateModel( - name='StatementTopic', + name='Statement', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('code', models.CharField(max_length=10, unique=True)), - ('title', models.CharField(max_length=255)), - ('title_en', models.CharField(max_length=255, null=True)), - ('title_es', models.CharField(max_length=255, null=True)), - ('title_fr', models.CharField(max_length=255, null=True)), - ('icon', models.FileField(blank=True, default=None, null=True, upload_to='statement/statement_topic/icons', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['svg', 'png'])])), - ('description', models.TextField(blank=True, default=None, null=True)), - ('description_en', models.TextField(blank=True, default=None, null=True)), - ('description_es', models.TextField(blank=True, default=None, null=True)), - ('description_fr', models.TextField(blank=True, default=None, null=True)), - ('context', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='statement_topics', to='context.context')), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='code')), + ('title', models.TextField(verbose_name='title')), + ('title_en', models.TextField(null=True, verbose_name='title')), + ('title_es', models.TextField(null=True, verbose_name='title')), + ('title_fr', models.TextField(null=True, verbose_name='title')), + ('hints', models.TextField(blank=True, default=None, null=True, verbose_name='hints')), + ('hints_en', models.TextField(blank=True, default=None, null=True, verbose_name='hints')), + ('hints_es', models.TextField(blank=True, default=None, null=True, verbose_name='hints')), + ('hints_fr', models.TextField(blank=True, default=None, null=True, verbose_name='hints')), + ('is_experimental', models.BooleanField(default=False, verbose_name='experimental')), ], options={ 'ordering': ('order',), @@ -115,115 +113,72 @@ class Migration(migrations.Migration): }, ), migrations.CreateModel( - name='Statement', + name='StatementFormula', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('formula', models.TextField(verbose_name='formula')), + ('version', models.CharField(max_length=255, verbose_name='version')), + ('is_active', models.BooleanField(default=False, editable=False, verbose_name='active')), + ], + ), + migrations.CreateModel( + name='StatementTag', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('code', models.CharField(max_length=10, unique=True)), - ('title', models.TextField()), - ('title_en', models.TextField(null=True)), - ('title_es', models.TextField(null=True)), - ('title_fr', models.TextField(null=True)), - ('hints', models.TextField(blank=True, default=None, null=True)), - ('hints_en', models.TextField(blank=True, default=None, null=True)), - ('hints_es', models.TextField(blank=True, default=None, null=True)), - ('hints_fr', models.TextField(blank=True, default=None, null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('options', models.ManyToManyField(related_name='statements', through='statement.OptionStatement', to='survey.Option')), - ('questions', models.ManyToManyField(related_name='statements', through='statement.QuestionStatement', to='survey.Question')), - ('topic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='statements', to='statement.statementtopic')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_es', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_fr', models.CharField(max_length=255, null=True, verbose_name='title')), ], options={ 'ordering': ('order',), 'abstract': False, }, ), - migrations.AddField( - model_name='questionstatement', - name='statement', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.statement'), - ), - migrations.AddField( - model_name='questionstatement', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='optionstatement', - name='statement', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.statement'), - ), - migrations.AddField( - model_name='optionstatement', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL), - ), migrations.CreateModel( - name='OptionOpportunity', + name='StatementTagGroup', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('opportunity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.opportunity')), - ('option', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.option')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_es', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_fr', models.CharField(max_length=255, null=True, verbose_name='title')), ], options={ - 'verbose_name_plural': 'Option Opportunities', 'ordering': ('order',), 'abstract': False, }, ), migrations.CreateModel( - name='OptionMitigation', + name='StatementTopic', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('mitigation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.mitigation')), - ('option', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.option')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='code')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_es', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_fr', models.CharField(max_length=255, null=True, verbose_name='title')), + ('icon', models.FileField(blank=True, default=None, null=True, upload_to='statement/statement_topic/icons', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['svg', 'png'])], verbose_name='icon')), + ('description', models.TextField(blank=True, default=None, null=True, verbose_name='description')), + ('description_en', models.TextField(blank=True, default=None, null=True, verbose_name='description')), + ('description_es', models.TextField(blank=True, default=None, null=True, verbose_name='description')), + ('description_fr', models.TextField(blank=True, default=None, null=True, verbose_name='description')), + ('context', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='statement_topics', to='context.context', verbose_name='context')), ], options={ 'ordering': ('order',), 'abstract': False, }, ), - migrations.AddField( - model_name='opportunity', - name='options', - field=models.ManyToManyField(related_name='opportunities', through='statement.OptionOpportunity', to='survey.Option'), - ), - migrations.AddField( - model_name='opportunity', - name='statement', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='statement.statement'), - ), - migrations.AddField( - model_name='opportunity', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='mitigation', - name='options', - field=models.ManyToManyField(related_name='mitigations', through='statement.OptionMitigation', to='survey.Option'), - ), - migrations.AddField( - model_name='mitigation', - name='statement', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mitigations', to='statement.statement'), - ), - migrations.AddField( - model_name='mitigation', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL), - ), ] diff --git a/statement/migrations/0002_initial.py b/statement/migrations/0002_initial.py new file mode 100644 index 0000000..60a24c8 --- /dev/null +++ b/statement/migrations/0002_initial.py @@ -0,0 +1,248 @@ +# Generated by Django 4.2.17 on 2025-01-14 09:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('survey', '0001_initial'), + ('statement', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('context', '0002_initial'), + ] + + operations = [ + migrations.AddField( + model_name='statementtopic', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='statementtopic', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='statementtaggroup', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='statementtaggroup', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='statementtag', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='statementtag', + name='group', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tags', to='statement.statementtaggroup', verbose_name='statement tag group'), + ), + migrations.AddField( + model_name='statementtag', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='statementformula', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='statementformula', + name='module', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='formulas', to='context.module', verbose_name='module'), + ), + migrations.AddField( + model_name='statementformula', + name='question_group', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='formulas', to='survey.questiongroup', verbose_name='question group'), + ), + migrations.AddField( + model_name='statementformula', + name='statement', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='formulas', to='statement.statement', verbose_name='statement'), + ), + migrations.AddField( + model_name='statementformula', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='statement', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='statement', + name='options', + field=models.ManyToManyField(related_name='statements', through='statement.OptionStatement', to='survey.option', verbose_name='options'), + ), + migrations.AddField( + model_name='statement', + name='questions', + field=models.ManyToManyField(related_name='statements', through='statement.QuestionStatement', to='survey.question', verbose_name='questions'), + ), + migrations.AddField( + model_name='statement', + name='tags', + field=models.ManyToManyField(related_name='statements', to='statement.statementtag', verbose_name='statement tags'), + ), + migrations.AddField( + model_name='statement', + name='topic', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='statements', to='statement.statementtopic', verbose_name='statement topic'), + ), + migrations.AddField( + model_name='statement', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='questionstatement', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='questionstatement', + name='question', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.question', verbose_name='question'), + ), + migrations.AddField( + model_name='questionstatement', + name='question_group', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='survey.questiongroup', verbose_name='question group'), + ), + migrations.AddField( + model_name='questionstatement', + name='statement', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.statement', verbose_name='statement'), + ), + migrations.AddField( + model_name='questionstatement', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='optionstatement', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='optionstatement', + name='option', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.option', verbose_name='option'), + ), + migrations.AddField( + model_name='optionstatement', + name='question_group', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='survey.questiongroup', verbose_name='question group'), + ), + migrations.AddField( + model_name='optionstatement', + name='statement', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.statement', verbose_name='statement'), + ), + migrations.AddField( + model_name='optionstatement', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='opportunity', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='opportunity', + name='options', + field=models.ManyToManyField(blank=True, related_name='opportunities', to='survey.option', verbose_name='options'), + ), + migrations.AddField( + model_name='opportunity', + name='statements', + field=models.ManyToManyField(blank=True, related_name='opportunities', to='statement.statement', verbose_name='statements'), + ), + migrations.AddField( + model_name='opportunity', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='mitigation', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='mitigation', + name='options', + field=models.ManyToManyField(blank=True, related_name='mitigations', to='survey.option', verbose_name='options'), + ), + migrations.AddField( + model_name='mitigation', + name='statements', + field=models.ManyToManyField(blank=True, related_name='mitigations', to='statement.statement', verbose_name='statements'), + ), + migrations.AddField( + model_name='mitigation', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddConstraint( + model_name='statementformula', + constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', True)), fields=('statement', 'version'), name='one_version_formula_statement'), + ), + migrations.AddConstraint( + model_name='statementformula', + constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', True)), fields=('statement',), name='one_active_version_formula_statement'), + ), + migrations.AddConstraint( + model_name='statementformula', + constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', False)), fields=('question_group', 'statement', 'version'), name='one_version_formula_question_group_statement'), + ), + migrations.AddConstraint( + model_name='statementformula', + constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', False)), fields=('question_group', 'statement'), name='one_active_formula_question_group_statement'), + ), + migrations.AddConstraint( + model_name='questionstatement', + constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', True)), fields=('question', 'statement', 'version'), name='unique_version_question_statement'), + ), + migrations.AddConstraint( + model_name='questionstatement', + constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', True)), fields=('question', 'statement'), name='one_active_question_statement'), + ), + migrations.AddConstraint( + model_name='questionstatement', + constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', False)), fields=('question', 'statement', 'question_group', 'version'), name='unique_version_question_question_group_statement'), + ), + migrations.AddConstraint( + model_name='questionstatement', + constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', False)), fields=('question', 'statement', 'question_group'), name='one_active_question_question_group_statement'), + ), + migrations.AddConstraint( + model_name='optionstatement', + constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', True)), fields=('option', 'statement', 'version'), name='unique_version_option_statement'), + ), + migrations.AddConstraint( + model_name='optionstatement', + constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', True)), fields=('option', 'statement'), name='one_active_option_statement'), + ), + migrations.AddConstraint( + model_name='optionstatement', + constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', False)), fields=('option', 'statement', 'question_group', 'version'), name='unique_version_option_question_group_statement'), + ), + migrations.AddConstraint( + model_name='optionstatement', + constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', False)), fields=('option', 'statement', 'question_group'), name='one_active_option_question_group_statement'), + ), + ] diff --git a/statement/migrations/0002_statement_tags.py b/statement/migrations/0002_statement_tags.py deleted file mode 100644 index 0334f42..0000000 --- a/statement/migrations/0002_statement_tags.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 3.2.4 on 2021-06-29 06:47 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('statement', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='StatementTagGroup', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=255)), - ('title_en', models.CharField(max_length=255, null=True)), - ('title_es', models.CharField(max_length=255, null=True)), - ('title_fr', models.CharField(max_length=255, null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ('order',), - 'abstract': False, - }, - ), - migrations.CreateModel( - name='StatementTag', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=255)), - ('title_en', models.CharField(max_length=255, null=True)), - ('title_es', models.CharField(max_length=255, null=True)), - ('title_fr', models.CharField(max_length=255, null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tags', to='statement.statementtaggroup')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ('order',), - 'abstract': False, - }, - ), - migrations.AddField( - model_name='statement', - name='tags', - field=models.ManyToManyField(related_name='statements', to='statement.StatementTag'), - ), - ] diff --git a/statement/migrations/0003_statement_is_experimental.py b/statement/migrations/0003_statement_is_experimental.py deleted file mode 100644 index fa82055..0000000 --- a/statement/migrations/0003_statement_is_experimental.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.8 on 2021-11-01 05:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('statement', '0002_statement_tags'), - ] - - operations = [ - migrations.AddField( - model_name='statement', - name='is_experimental', - field=models.BooleanField(default=False), - ), - ] diff --git a/statement/migrations/0004_add_verbose_name.py b/statement/migrations/0004_add_verbose_name.py deleted file mode 100644 index 63b5072..0000000 --- a/statement/migrations/0004_add_verbose_name.py +++ /dev/null @@ -1,513 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 14:40 - -from django.conf import settings -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0002_add_verbose_name'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('survey', '0010_add_verbose_name'), - ('statement', '0003_statement_is_experimental'), - ] - - operations = [ - migrations.AlterModelOptions( - name='optionopportunity', - options={'ordering': ('order',)}, - ), - migrations.AlterField( - model_name='mitigation', - name='code', - field=models.CharField(max_length=10, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='mitigation', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='mitigation', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='mitigation', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='mitigation', - name='options', - field=models.ManyToManyField(related_name='mitigations', through='statement.OptionMitigation', to='survey.Option', verbose_name='options'), - ), - migrations.AlterField( - model_name='mitigation', - name='statement', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mitigations', to='statement.statement', verbose_name='statement'), - ), - migrations.AlterField( - model_name='mitigation', - name='title', - field=models.TextField(verbose_name='title'), - ), - migrations.AlterField( - model_name='mitigation', - name='title_en', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='mitigation', - name='title_es', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='mitigation', - name='title_fr', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='mitigation', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='opportunity', - name='code', - field=models.CharField(max_length=10, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='opportunity', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='opportunity', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='opportunity', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='opportunity', - name='options', - field=models.ManyToManyField(related_name='opportunities', through='statement.OptionOpportunity', to='survey.Option', verbose_name='options'), - ), - migrations.AlterField( - model_name='opportunity', - name='statement', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='statement.statement', verbose_name='statement'), - ), - migrations.AlterField( - model_name='opportunity', - name='title', - field=models.TextField(verbose_name='title'), - ), - migrations.AlterField( - model_name='opportunity', - name='title_en', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='opportunity', - name='title_es', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='opportunity', - name='title_fr', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='opportunity', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='optionmitigation', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='optionmitigation', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='optionmitigation', - name='mitigation', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.mitigation', verbose_name='mitigation'), - ), - migrations.AlterField( - model_name='optionmitigation', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='optionmitigation', - name='option', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.option', verbose_name='option'), - ), - migrations.AlterField( - model_name='optionmitigation', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='optionopportunity', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='optionopportunity', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='optionopportunity', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='optionopportunity', - name='opportunity', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.opportunity', verbose_name='opportunity'), - ), - migrations.AlterField( - model_name='optionopportunity', - name='option', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.option', verbose_name='option'), - ), - migrations.AlterField( - model_name='optionopportunity', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='optionstatement', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='optionstatement', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='optionstatement', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='optionstatement', - name='option', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.option', verbose_name='option'), - ), - migrations.AlterField( - model_name='optionstatement', - name='statement', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.statement', verbose_name='statement'), - ), - migrations.AlterField( - model_name='optionstatement', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='optionstatement', - name='weightage', - field=models.FloatField(verbose_name='weightage'), - ), - migrations.AlterField( - model_name='questionstatement', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='questionstatement', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='questionstatement', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='questionstatement', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.question', verbose_name='question'), - ), - migrations.AlterField( - model_name='questionstatement', - name='statement', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.statement', verbose_name='statement'), - ), - migrations.AlterField( - model_name='questionstatement', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='questionstatement', - name='weightage', - field=models.FloatField(verbose_name='weightage'), - ), - migrations.AlterField( - model_name='statement', - name='code', - field=models.CharField(max_length=10, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='statement', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='statement', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='statement', - name='hints', - field=models.TextField(blank=True, default=None, null=True, verbose_name='hints'), - ), - migrations.AlterField( - model_name='statement', - name='hints_en', - field=models.TextField(blank=True, default=None, null=True, verbose_name='hints'), - ), - migrations.AlterField( - model_name='statement', - name='hints_es', - field=models.TextField(blank=True, default=None, null=True, verbose_name='hints'), - ), - migrations.AlterField( - model_name='statement', - name='hints_fr', - field=models.TextField(blank=True, default=None, null=True, verbose_name='hints'), - ), - migrations.AlterField( - model_name='statement', - name='is_experimental', - field=models.BooleanField(default=False, verbose_name='experimental'), - ), - migrations.AlterField( - model_name='statement', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='statement', - name='options', - field=models.ManyToManyField(related_name='statements', through='statement.OptionStatement', to='survey.Option', verbose_name='options'), - ), - migrations.AlterField( - model_name='statement', - name='questions', - field=models.ManyToManyField(related_name='statements', through='statement.QuestionStatement', to='survey.Question', verbose_name='questions'), - ), - migrations.AlterField( - model_name='statement', - name='tags', - field=models.ManyToManyField(related_name='statements', to='statement.StatementTag', verbose_name='statement tags'), - ), - migrations.AlterField( - model_name='statement', - name='title', - field=models.TextField(verbose_name='title'), - ), - migrations.AlterField( - model_name='statement', - name='title_en', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statement', - name='title_es', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statement', - name='title_fr', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statement', - name='topic', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='statements', to='statement.statementtopic', verbose_name='statement topic'), - ), - migrations.AlterField( - model_name='statement', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='statementtag', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='statementtag', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='statementtag', - name='group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tags', to='statement.statementtaggroup', verbose_name='statement tag group'), - ), - migrations.AlterField( - model_name='statementtag', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='statementtag', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtag', - name='title_en', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtag', - name='title_es', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtag', - name='title_fr', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtag', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='statementtaggroup', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='statementtaggroup', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='statementtaggroup', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='statementtaggroup', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtaggroup', - name='title_en', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtaggroup', - name='title_es', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtaggroup', - name='title_fr', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtaggroup', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='statementtopic', - name='code', - field=models.CharField(max_length=10, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='statementtopic', - name='context', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='statement_topics', to='context.context', verbose_name='context'), - ), - migrations.AlterField( - model_name='statementtopic', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='statementtopic', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='statementtopic', - name='description', - field=models.TextField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='statementtopic', - name='description_en', - field=models.TextField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='statementtopic', - name='description_es', - field=models.TextField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='statementtopic', - name='description_fr', - field=models.TextField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='statementtopic', - name='icon', - field=models.FileField(blank=True, default=None, null=True, upload_to='statement/statement_topic/icons', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['svg', 'png'])], verbose_name='icon'), - ), - migrations.AlterField( - model_name='statementtopic', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='statementtopic', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtopic', - name='title_en', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtopic', - name='title_es', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtopic', - name='title_fr', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='statementtopic', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - ] diff --git a/statement/migrations/0005_statement_question_option_version.py b/statement/migrations/0005_statement_question_option_version.py deleted file mode 100644 index 9d0dab9..0000000 --- a/statement/migrations/0005_statement_question_option_version.py +++ /dev/null @@ -1,51 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-16 06:20 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('statement', '0004_add_verbose_name'), - ] - - operations = [ - migrations.AddField( - model_name='optionstatement', - name='is_active', - field=models.BooleanField(default=False, editable=False, verbose_name='active'), - ), - migrations.AddField( - model_name='optionstatement', - name='version', - field=models.CharField(default='initial', max_length=255, verbose_name='version'), - preserve_default=False, - ), - migrations.AddField( - model_name='questionstatement', - name='is_active', - field=models.BooleanField(default=False, editable=False, verbose_name='active'), - ), - migrations.AddField( - model_name='questionstatement', - name='version', - field=models.CharField(default='initial', max_length=255, verbose_name='version'), - preserve_default=False, - ), - migrations.AddConstraint( - model_name='optionstatement', - constraint=models.UniqueConstraint(fields=('option', 'statement', 'version'), name='unique_version_option_statement'), - ), - migrations.AddConstraint( - model_name='optionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('is_active', True)), fields=('option', 'statement'), name='one_active_option_statement'), - ), - migrations.AddConstraint( - model_name='questionstatement', - constraint=models.UniqueConstraint(fields=('question', 'statement', 'version'), name='unique_version_question_statement'), - ), - migrations.AddConstraint( - model_name='questionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('is_active', True)), fields=('question', 'statement'), name='one_active_question_statement'), - ), - ] diff --git a/statement/migrations/0006_make_initial_version_active.py b/statement/migrations/0006_make_initial_version_active.py deleted file mode 100644 index 747e5a0..0000000 --- a/statement/migrations/0006_make_initial_version_active.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-16 06:21 - -from django.db import migrations - -def forward_migration(apps, schema_editor): - QuestionStatement = apps.get_model('statement', 'QuestionStatement') - OptionStatement = apps.get_model('statement', 'OptionStatement') - - QuestionStatement.objects.filter(version="initial").update(is_active=True) - OptionStatement.objects.filter(version="initial").update(is_active=True) - -class Migration(migrations.Migration): - - dependencies = [ - ('statement', '0005_statement_question_option_version'), - ] - - operations = [ - migrations.RunPython(forward_migration, migrations.RunPython.noop) - ] diff --git a/statement/migrations/0007_increase_code_max_length.py b/statement/migrations/0007_increase_code_max_length.py deleted file mode 100644 index e00402a..0000000 --- a/statement/migrations/0007_increase_code_max_length.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-18 04:52 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('statement', '0006_make_initial_version_active'), - ] - - operations = [ - migrations.AlterField( - model_name='mitigation', - name='code', - field=models.CharField(max_length=50, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='opportunity', - name='code', - field=models.CharField(max_length=50, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='statement', - name='code', - field=models.CharField(max_length=50, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='statementtopic', - name='code', - field=models.CharField(max_length=50, unique=True, verbose_name='code'), - ), - ] diff --git a/statement/migrations/0008_delete_option_mitigation_opportunity.py b/statement/migrations/0008_delete_option_mitigation_opportunity.py deleted file mode 100644 index e80f505..0000000 --- a/statement/migrations/0008_delete_option_mitigation_opportunity.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-28 11:41 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('statement', '0007_increase_code_max_length'), - ] - - operations = [ - migrations.RemoveField( - model_name='optionopportunity', - name='created_by', - ), - migrations.RemoveField( - model_name='optionopportunity', - name='opportunity', - ), - migrations.RemoveField( - model_name='optionopportunity', - name='option', - ), - migrations.RemoveField( - model_name='optionopportunity', - name='updated_by', - ), - migrations.RemoveField( - model_name='mitigation', - name='options', - ), - migrations.RemoveField( - model_name='opportunity', - name='options', - ), - migrations.DeleteModel( - name='OptionMitigation', - ), - migrations.DeleteModel( - name='OptionOpportunity', - ), - ] diff --git a/statement/migrations/0009_statement_question_groups.py b/statement/migrations/0009_statement_question_groups.py deleted file mode 100644 index eade274..0000000 --- a/statement/migrations/0009_statement_question_groups.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-07 10:28 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0013_option_mitigation_opportunity_json_field'), - ('statement', '0008_delete_option_mitigation_opportunity'), - ] - - operations = [ - migrations.AddField( - model_name='statement', - name='question_groups', - field=models.ManyToManyField(related_name='statements', to='survey.QuestionGroup', verbose_name='question groups'), - ), - ] diff --git a/statement/migrations/0010_add_question_group_to_weightage.py b/statement/migrations/0010_add_question_group_to_weightage.py deleted file mode 100644 index 256dfd4..0000000 --- a/statement/migrations/0010_add_question_group_to_weightage.py +++ /dev/null @@ -1,77 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-16 06:43 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0013_option_mitigation_opportunity_json_field'), - ('statement', '0009_statement_question_groups'), - ] - - operations = [ - migrations.RemoveConstraint( - model_name='optionstatement', - name='unique_version_option_statement', - ), - migrations.RemoveConstraint( - model_name='optionstatement', - name='one_active_option_statement', - ), - migrations.RemoveConstraint( - model_name='questionstatement', - name='unique_version_question_statement', - ), - migrations.RemoveConstraint( - model_name='questionstatement', - name='one_active_question_statement', - ), - migrations.RemoveField( - model_name='statement', - name='question_groups', - ), - migrations.AddField( - model_name='optionstatement', - name='question_group', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='survey.questiongroup', verbose_name='question group'), - ), - migrations.AddField( - model_name='questionstatement', - name='question_group', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='survey.questiongroup', verbose_name='question group'), - ), - migrations.AddConstraint( - model_name='optionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', True)), fields=('option', 'statement', 'version'), name='unique_version_option_statement'), - ), - migrations.AddConstraint( - model_name='optionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', True)), fields=('option', 'statement'), name='one_active_option_statement'), - ), - migrations.AddConstraint( - model_name='optionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', False)), fields=('option', 'statement', 'question_group', 'version'), name='unique_version_option_question_group_statement'), - ), - migrations.AddConstraint( - model_name='optionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', False)), fields=('option', 'statement', 'question_group'), name='one_active_option_question_group_statement'), - ), - migrations.AddConstraint( - model_name='questionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', True)), fields=('question', 'statement', 'version'), name='unique_version_question_statement'), - ), - migrations.AddConstraint( - model_name='questionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', True)), fields=('question', 'statement'), name='one_active_question_statement'), - ), - migrations.AddConstraint( - model_name='questionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', False)), fields=('question', 'statement', 'question_group', 'version'), name='unique_version_question_question_group_statement'), - ), - migrations.AddConstraint( - model_name='questionstatement', - constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', False)), fields=('question', 'statement', 'question_group'), name='one_active_question_question_group_statement'), - ), - ] diff --git a/statement/migrations/0011_create_statement_formula.py b/statement/migrations/0011_create_statement_formula.py deleted file mode 100644 index 2775d77..0000000 --- a/statement/migrations/0011_create_statement_formula.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 3.2.13 on 2022-06-23 05:26 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('context', '0003_increase_code_max_length'), - ('survey', '0016_remove_question_module'), - ('statement', '0010_add_question_group_to_weightage'), - ] - - operations = [ - migrations.CreateModel( - name='StatementFormula', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), - ('formula', models.TextField(verbose_name='formula')), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by')), - ('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='formulas', to='context.module', verbose_name='module')), - ('question_group', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='formulas', to='survey.questiongroup', verbose_name='question group')), - ('statement', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='formulas', to='statement.statement', verbose_name='statement')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by')), - ], - ), - migrations.AddConstraint( - model_name='statementformula', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', False)), fields=('question_group', 'statement'), name='one_formula_question_group_statement'), - ), - migrations.AddConstraint( - model_name='statementformula', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', True)), fields=('statement',), name='one_formula_statement'), - ), - ] diff --git a/statement/migrations/0012_create_statement_formula_version.py b/statement/migrations/0012_create_statement_formula_version.py deleted file mode 100644 index 87b0562..0000000 --- a/statement/migrations/0012_create_statement_formula_version.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 3.2.13 on 2022-06-27 05:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('statement', '0011_create_statement_formula'), - ] - - operations = [ - migrations.RemoveConstraint( - model_name='statementformula', - name='one_formula_question_group_statement', - ), - migrations.RemoveConstraint( - model_name='statementformula', - name='one_formula_statement', - ), - migrations.AddField( - model_name='statementformula', - name='is_active', - field=models.BooleanField(default=False, editable=False, verbose_name='active'), - ), - migrations.AddField( - model_name='statementformula', - name='version', - field=models.CharField(default='initial', max_length=255, verbose_name='version'), - preserve_default=False, - ), - migrations.AddConstraint( - model_name='statementformula', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', True)), fields=('statement', 'version'), name='one_version_formula_statement'), - ), - migrations.AddConstraint( - model_name='statementformula', - constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', True)), fields=('statement',), name='one_active_version_formula_statement'), - ), - migrations.AddConstraint( - model_name='statementformula', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', False)), fields=('question_group', 'statement', 'version'), name='one_version_formula_question_group_statement'), - ), - migrations.AddConstraint( - model_name='statementformula', - constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('question_group__isnull', False)), fields=('question_group', 'statement'), name='one_active_formula_question_group_statement'), - ), - ] diff --git a/statement/migrations/0013_mitigation_opportunity_multiple_statement.py b/statement/migrations/0013_mitigation_opportunity_multiple_statement.py deleted file mode 100644 index 28a547c..0000000 --- a/statement/migrations/0013_mitigation_opportunity_multiple_statement.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 3.2.18 on 2023-02-28 09:57 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('statement', '0012_create_statement_formula_version'), - ] - - operations = [ - migrations.AlterModelOptions( - name='opportunity', - options={'ordering': ('order',), 'verbose_name_plural': 'opportunities'}, - ), - migrations.AddField( - model_name='mitigation', - name='statements', - field=models.ManyToManyField(blank=True, related_name='mitigations', to='statement.Statement', verbose_name='statements'), - ), - migrations.AddField( - model_name='opportunity', - name='statements', - field=models.ManyToManyField(blank=True, related_name='opportunities', to='statement.Statement', verbose_name='statements'), - ), - migrations.AlterField( - model_name='mitigation', - name='statement', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='statement.statement'), - ), - migrations.AlterField( - model_name='opportunity', - name='statement', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='statement.statement'), - ), - ] diff --git a/statement/migrations/0014_single_statement_to_m2m.py b/statement/migrations/0014_single_statement_to_m2m.py deleted file mode 100644 index d65dd4c..0000000 --- a/statement/migrations/0014_single_statement_to_m2m.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 3.2.18 on 2023-02-28 09:57 - -from django.db import migrations - -def forward_migration(apps, schema_editor): - Mitigation = apps.get_model('statement', 'Mitigation') - Opportunity = apps.get_model('statement', 'Opportunity') - for mitigation in Mitigation.objects.all(): - mitigation.statements.add(mitigation.statement) - for opportunity in Opportunity.objects.all(): - opportunity.statements.add(opportunity.statement) - -def backward_migration(apps, schema_editor): - Mitigation = apps.get_model('statement', 'Mitigation') - Opportunity = apps.get_model('statement', 'Opportunity') - for mitigation in Mitigation.objects.all(): - mitigation.statement = mitigation.statements.first() - mitigation.save() - for opportunity in Opportunity.objects.all(): - opportunity.statement = opportunity.statements.first() - opportunity.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('statement', '0013_mitigation_opportunity_multiple_statement'), - ] - - operations = [migrations.RunPython(forward_migration, backward_migration)] diff --git a/statement/migrations/0015_add_options_field_mitigation_opportunity.py b/statement/migrations/0015_add_options_field_mitigation_opportunity.py deleted file mode 100644 index 667a85d..0000000 --- a/statement/migrations/0015_add_options_field_mitigation_opportunity.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 3.2.18 on 2023-02-28 10:05 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0017_json_field_blank_true_default'), - ('statement', '0014_single_statement_to_m2m'), - ] - - operations = [ - migrations.RemoveField( - model_name='mitigation', - name='statement', - ), - migrations.RemoveField( - model_name='opportunity', - name='statement', - ), - migrations.AddField( - model_name='mitigation', - name='options', - field=models.ManyToManyField(blank=True, related_name='mitigations', to='survey.Option', verbose_name='options'), - ), - migrations.AddField( - model_name='opportunity', - name='options', - field=models.ManyToManyField(blank=True, related_name='opportunities', to='survey.Option', verbose_name='options'), - ), - ] diff --git a/statement/migrations/0016_add_new_fields_migration_opportunity.py b/statement/migrations/0016_add_new_fields_migration_opportunity.py deleted file mode 100644 index 792992a..0000000 --- a/statement/migrations/0016_add_new_fields_migration_opportunity.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 3.2.18 on 2023-03-03 07:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('statement', '0015_add_options_field_mitigation_opportunity'), - ] - - operations = [ - migrations.AddField( - model_name='mitigation', - name='implementor', - field=models.CharField(blank=True, choices=[('local', 'Local'), ('regional', 'Regional'), ('hq', 'HQ'), ('all', 'All')], default=None, max_length=8, null=True, verbose_name='implementor'), - ), - migrations.AddField( - model_name='mitigation', - name='priority', - field=models.CharField(blank=True, choices=[('high', 'High'), ('medium', 'Medium'), ('low', 'Low')], default=None, max_length=6, null=True, verbose_name='priority'), - ), - migrations.AddField( - model_name='mitigation', - name='rank', - field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='rank'), - ), - migrations.AddField( - model_name='opportunity', - name='implementor', - field=models.CharField(blank=True, choices=[('local', 'Local'), ('regional', 'Regional'), ('hq', 'HQ'), ('all', 'All')], default=None, max_length=8, null=True, verbose_name='implementor'), - ), - migrations.AddField( - model_name='opportunity', - name='priority', - field=models.CharField(blank=True, choices=[('high', 'High'), ('medium', 'Medium'), ('low', 'Low')], default=None, max_length=6, null=True, verbose_name='priority'), - ), - migrations.AddField( - model_name='opportunity', - name='rank', - field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='rank'), - ), - ] diff --git a/summary/migrations/0001_initial.py b/summary/migrations/0001_initial.py index a25ae2e..686828e 100644 --- a/summary/migrations/0001_initial.py +++ b/summary/migrations/0001_initial.py @@ -1,8 +1,6 @@ -# Generated by Django 3.2.4 on 2021-06-24 09:26 +# Generated by Django 4.2.17 on 2025-01-14 09:53 -from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): @@ -10,9 +8,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('survey', '0002_add_skip_logic'), - ('statement', '0001_initial'), ] operations = [ @@ -20,16 +15,25 @@ class Migration(migrations.Migration): name='SurveyResult', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('score', models.FloatField()), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('statement', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.statement')), - ('survey', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='survey.survey')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('score', models.FloatField(verbose_name='score')), ], options={ - 'abstract': False, + 'permissions': [('add_baseline_feedback', 'Can add baseline feedback')], }, ), + migrations.CreateModel( + name='SurveyResultFeedback', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('actual_score', models.FloatField(verbose_name='actual score')), + ('expected_score', models.FloatField(verbose_name='expected score')), + ('comment', models.TextField(blank=True, default=None, null=True, verbose_name='comment')), + ('status', models.CharField(choices=[('pending', 'Pending'), ('acknowledged', 'Acknowledged')], default='pending', max_length=12)), + ('is_baseline', models.BooleanField(default=False, verbose_name='baseline')), + ], + ), ] diff --git a/summary/migrations/0002_initial.py b/summary/migrations/0002_initial.py new file mode 100644 index 0000000..985f84e --- /dev/null +++ b/summary/migrations/0002_initial.py @@ -0,0 +1,78 @@ +# Generated by Django 4.2.17 on 2025-01-14 09:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('context', '0002_initial'), + ('statement', '0002_initial'), + ('survey', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('summary', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='surveyresultfeedback', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='surveyresultfeedback', + name='survey_result', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='feedbacks', to='summary.surveyresult', verbose_name='survey result'), + ), + migrations.AddField( + model_name='surveyresultfeedback', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='surveyresult', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='surveyresult', + name='module', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='context.module', verbose_name='module'), + ), + migrations.AddField( + model_name='surveyresult', + name='question_group', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='results', to='survey.questiongroup', verbose_name='question group'), + ), + migrations.AddField( + model_name='surveyresult', + name='statement', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.statement', verbose_name='statement'), + ), + migrations.AddField( + model_name='surveyresult', + name='survey', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='survey.survey', verbose_name='survey'), + ), + migrations.AddField( + model_name='surveyresult', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddConstraint( + model_name='surveyresultfeedback', + constraint=models.UniqueConstraint(condition=models.Q(('is_baseline', True)), fields=('survey_result',), name='survey_result_one_baseline'), + ), + migrations.AddConstraint( + model_name='surveyresult', + constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', True)), fields=('statement', 'survey', 'module'), name='unique_module_survey_statement'), + ), + migrations.AddConstraint( + model_name='surveyresult', + constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', False)), fields=('statement', 'survey', 'module', 'question_group'), name='unique_module_survey_question_group_statement'), + ), + ] diff --git a/summary/migrations/0002_surveyresult_module.py b/summary/migrations/0002_surveyresult_module.py deleted file mode 100644 index de34b00..0000000 --- a/summary/migrations/0002_surveyresult_module.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.8 on 2021-11-08 11:26 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0001_initial'), - ('summary', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='surveyresult', - name='module', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='results', to='context.module'), - ), - ] diff --git a/summary/migrations/0003_populate_module_field.py b/summary/migrations/0003_populate_module_field.py deleted file mode 100644 index 45c5a9d..0000000 --- a/summary/migrations/0003_populate_module_field.py +++ /dev/null @@ -1,41 +0,0 @@ -# Generated by Django 3.2.8 on 2021-11-08 11:27 - -from django.db import migrations -from django.db.migrations import exceptions - - -def forward_migration(apps, schema_editor): - Module = apps.get_model('context', 'Module') - SurveyResult = apps.get_model('summary', 'SurveyResult') - default_module = Module.objects.first() - for survey_result in SurveyResult.objects.filter(module__isnull=True): - survey = survey_result.survey - answer = survey.answers.first() - if answer is None: - raise exceptions.InvalidMigrationPlan( - f'Survey {survey.pk} has no answer. Migration does not support such survey' - ) - modules = list(survey.answers.values_list('question__module', flat=True)) - non_null_modules = [ x for x in modules if x is not None] - if not non_null_modules: - if default_module is None: - raise exceptions.InvalidMigrationPlan( - 'Cannot set default module since there is no single module. Create at least one module' - ) - module = default_module - else: - module_id = max(non_null_modules, key=non_null_modules.count) - module = Module.objects.get(id=module_id) - survey_result.module = module - survey_result.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('summary', '0002_surveyresult_module'), - ] - - operations = [ - migrations.RunPython(forward_migration, migrations.RunPython.noop) - ] diff --git a/summary/migrations/0004_survey_result_module_non_nullable.py b/summary/migrations/0004_survey_result_module_non_nullable.py deleted file mode 100644 index efd6b2f..0000000 --- a/summary/migrations/0004_survey_result_module_non_nullable.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.8 on 2021-11-08 11:55 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0001_initial'), - ('summary', '0003_populate_module_field'), - ] - - operations = [ - migrations.AlterField( - model_name='surveyresult', - name='module', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='context.module'), - ), - ] diff --git a/summary/migrations/0005_add_verbose_name.py b/summary/migrations/0005_add_verbose_name.py deleted file mode 100644 index 982307f..0000000 --- a/summary/migrations/0005_add_verbose_name.py +++ /dev/null @@ -1,59 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 14:40 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0002_add_verbose_name'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('survey', '0010_add_verbose_name'), - ('statement', '0004_add_verbose_name'), - ('summary', '0004_survey_result_module_non_nullable'), - ] - - operations = [ - migrations.AlterField( - model_name='surveyresult', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='surveyresult', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='surveyresult', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='surveyresult', - name='module', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='context.module', verbose_name='module'), - ), - migrations.AlterField( - model_name='surveyresult', - name='score', - field=models.FloatField(verbose_name='score'), - ), - migrations.AlterField( - model_name='surveyresult', - name='statement', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='statement.statement', verbose_name='statement'), - ), - migrations.AlterField( - model_name='surveyresult', - name='survey', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='survey.survey', verbose_name='survey'), - ), - migrations.AlterField( - model_name='surveyresult', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - ] diff --git a/summary/migrations/0006_surveyresult_unique_module_survey_statement.py b/summary/migrations/0006_surveyresult_unique_module_survey_statement.py deleted file mode 100644 index b90df16..0000000 --- a/summary/migrations/0006_surveyresult_unique_module_survey_statement.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-24 08:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('summary', '0005_add_verbose_name'), - ] - - operations = [ - migrations.AddConstraint( - model_name='surveyresult', - constraint=models.UniqueConstraint(fields=('statement', 'survey', 'module'), name='unique_module_survey_statement'), - ), - ] diff --git a/summary/migrations/0007_survey_result_question_group.py b/summary/migrations/0007_survey_result_question_group.py deleted file mode 100644 index 51d377d..0000000 --- a/summary/migrations/0007_survey_result_question_group.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-10 07:25 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0013_option_mitigation_opportunity_json_field'), - ('summary', '0006_surveyresult_unique_module_survey_statement'), - ] - - operations = [ - migrations.RemoveConstraint( - model_name='surveyresult', - name='unique_module_survey_statement', - ), - migrations.AddField( - model_name='surveyresult', - name='question_group', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='results', to='survey.questiongroup', verbose_name='question group'), - ), - migrations.AddConstraint( - model_name='surveyresult', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', True)), fields=('statement', 'survey', 'module'), name='unique_module_survey_statement'), - ), - migrations.AddConstraint( - model_name='surveyresult', - constraint=models.UniqueConstraint(condition=models.Q(('question_group__isnull', False)), fields=('statement', 'survey', 'module', 'question_group'), name='unique_module_survey_question_group_statement'), - ), - ] diff --git a/summary/migrations/0008_surveyresultfeedback.py b/summary/migrations/0008_surveyresultfeedback.py deleted file mode 100644 index cc37668..0000000 --- a/summary/migrations/0008_surveyresultfeedback.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-11 06:17 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('summary', '0007_survey_result_question_group'), - ] - - operations = [ - migrations.CreateModel( - name='SurveyResultFeedback', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), - ('actual_score', models.FloatField(verbose_name='actual score')), - ('expected_score', models.FloatField(verbose_name='excepted score')), - ('comment', models.TextField(verbose_name='comment')), - ('status', models.CharField(choices=[('pending', 'Pending'), ('acknowledged', 'Acknowledged')], default='pending', max_length=12)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by')), - ('survey_result', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='feedbacks', to='summary.surveyresult', verbose_name='survey result')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by')), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/summary/migrations/0009_alter_surveyresultfeedback_expected_score.py b/summary/migrations/0009_alter_surveyresultfeedback_expected_score.py deleted file mode 100644 index defcfb6..0000000 --- a/summary/migrations/0009_alter_surveyresultfeedback_expected_score.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-18 08:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('summary', '0008_surveyresultfeedback'), - ] - - operations = [ - migrations.AlterField( - model_name='surveyresultfeedback', - name='expected_score', - field=models.FloatField(verbose_name='expected score'), - ), - ] diff --git a/summary/migrations/0010_surveyresultfeedback_is_baseline.py b/summary/migrations/0010_surveyresultfeedback_is_baseline.py deleted file mode 100644 index c748148..0000000 --- a/summary/migrations/0010_surveyresultfeedback_is_baseline.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-22 04:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('summary', '0009_alter_surveyresultfeedback_expected_score'), - ] - - operations = [ - migrations.AddField( - model_name='surveyresultfeedback', - name='is_baseline', - field=models.BooleanField(default=False, verbose_name='baseline'), - ), - ] diff --git a/summary/migrations/0011_alter_surveyresult_options.py b/summary/migrations/0011_alter_surveyresult_options.py deleted file mode 100644 index 0156c74..0000000 --- a/summary/migrations/0011_alter_surveyresult_options.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-04-04 05:19 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('summary', '0010_surveyresultfeedback_is_baseline'), - ] - - operations = [ - migrations.AlterModelOptions( - name='surveyresult', - options={'permissions': [('add_baseline_feedback', 'Can add baseline feedback')]}, - ), - ] diff --git a/summary/migrations/0012_alter_surveyresultfeedback_comment.py b/summary/migrations/0012_alter_surveyresultfeedback_comment.py deleted file mode 100644 index e8d05a9..0000000 --- a/summary/migrations/0012_alter_surveyresultfeedback_comment.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.13 on 2022-06-13 10:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('summary', '0011_alter_surveyresult_options'), - ] - - operations = [ - migrations.AlterField( - model_name='surveyresultfeedback', - name='comment', - field=models.TextField(blank=True, default=None, null=True, verbose_name='comment'), - ), - ] diff --git a/summary/migrations/0013_surveyresultfeedback_survey_result_one_baseline.py b/summary/migrations/0013_surveyresultfeedback_survey_result_one_baseline.py deleted file mode 100644 index 274add0..0000000 --- a/summary/migrations/0013_surveyresultfeedback_survey_result_one_baseline.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.18 on 2023-02-17 04:56 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('summary', '0012_alter_surveyresultfeedback_comment'), - ] - - operations = [ - migrations.AddConstraint( - model_name='surveyresultfeedback', - constraint=models.UniqueConstraint(condition=models.Q(('is_baseline', True)), fields=('survey_result',), name='survey_result_one_baseline'), - ), - ] diff --git a/support/migrations/0001_initial.py b/support/migrations/0001_initial.py index fe450f0..b09421c 100644 --- a/support/migrations/0001_initial.py +++ b/support/migrations/0001_initial.py @@ -1,8 +1,8 @@ -# Generated by Django 3.2 on 2021-05-25 09:13 +# Generated by Django 4.2.17 on 2025-01-14 09:53 -from django.conf import settings +import django.contrib.gis.db.models.fields from django.db import migrations, models -import django.db.models.deletion +import django_ckeditor_5.fields class Migration(migrations.Migration): @@ -10,27 +10,115 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ + migrations.CreateModel( + name='Action', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_es', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_fr', models.CharField(max_length=255, null=True, verbose_name='title')), + ('organization', models.CharField(max_length=255, verbose_name='organization')), + ('summary', models.TextField(verbose_name='summary')), + ('summary_en', models.TextField(null=True, verbose_name='summary')), + ('summary_es', models.TextField(null=True, verbose_name='summary')), + ('summary_fr', models.TextField(null=True, verbose_name='summary')), + ('description', django_ckeditor_5.fields.CKEditor5Field(verbose_name='description')), + ('description_en', django_ckeditor_5.fields.CKEditor5Field(null=True, verbose_name='description')), + ('description_es', django_ckeditor_5.fields.CKEditor5Field(null=True, verbose_name='description')), + ('description_fr', django_ckeditor_5.fields.CKEditor5Field(null=True, verbose_name='description')), + ('point', django.contrib.gis.db.models.fields.PointField(srid=4326, verbose_name='point')), + ], + options={ + 'ordering': ('order',), + 'abstract': False, + }, + ), + migrations.CreateModel( + name='EmailTemplate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('identifier', models.CharField(max_length=50, unique=True, verbose_name='identifier')), + ('subject', models.CharField(max_length=255, verbose_name='subject')), + ('html_message', django_ckeditor_5.fields.CKEditor5Field(verbose_name='html message')), + ('text_message', models.TextField(verbose_name='text message')), + ], + ), migrations.CreateModel( name='FrequentlyAskedQuestion', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('question', models.TextField()), - ('question_en', models.TextField(null=True)), - ('question_es', models.TextField(null=True)), - ('question_fr', models.TextField(null=True)), - ('answer', models.TextField()), - ('answer_en', models.TextField(null=True)), - ('answer_es', models.TextField(null=True)), - ('answer_fr', models.TextField(null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('question', models.TextField(verbose_name='question')), + ('question_en', models.TextField(null=True, verbose_name='question')), + ('question_es', models.TextField(null=True, verbose_name='question')), + ('question_fr', models.TextField(null=True, verbose_name='question')), + ('answer', models.TextField(verbose_name='answer')), + ('answer_en', models.TextField(null=True, verbose_name='answer')), + ('answer_es', models.TextField(null=True, verbose_name='answer')), + ('answer_fr', models.TextField(null=True, verbose_name='answer')), + ], + options={ + 'ordering': ('order',), + 'abstract': False, + }, + ), + migrations.CreateModel( + name='LegalDocument', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('document_type', models.CharField(choices=[('terms-and-conditions', 'Terms And Conditions'), ('privacy-policy', 'Privacy Policy'), ('cookie-policy', 'Cookie Policy')], max_length=20, unique=True, verbose_name='document type')), + ('description', django_ckeditor_5.fields.CKEditor5Field(verbose_name='description')), + ('description_en', django_ckeditor_5.fields.CKEditor5Field(null=True, verbose_name='description')), + ('description_es', django_ckeditor_5.fields.CKEditor5Field(null=True, verbose_name='description')), + ('description_fr', django_ckeditor_5.fields.CKEditor5Field(null=True, verbose_name='description')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Resource', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_es', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_fr', models.CharField(max_length=255, null=True, verbose_name='title')), + ('description', models.TextField(verbose_name='description')), + ('description_en', models.TextField(null=True, verbose_name='description')), + ('description_es', models.TextField(null=True, verbose_name='description')), + ('description_fr', models.TextField(null=True, verbose_name='description')), + ('resource_type', models.CharField(choices=[('attachment', 'Attachment'), ('video', 'Video')], max_length=10, verbose_name='resource type')), + ('video_url', models.URLField(blank=True, default=None, null=True, verbose_name='video url')), + ('attachment', models.FileField(blank=True, default=None, null=True, upload_to='', verbose_name='attachment')), + ], + options={ + 'ordering': ('order',), + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ResourceTag', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('title', models.CharField(max_length=50, verbose_name='title')), ], options={ 'ordering': ('order',), diff --git a/support/migrations/0002_initial.py b/support/migrations/0002_initial.py new file mode 100644 index 0000000..b6af70e --- /dev/null +++ b/support/migrations/0002_initial.py @@ -0,0 +1,79 @@ +# Generated by Django 4.2.17 on 2025-01-14 09:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('support', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('context', '0002_initial'), + ] + + operations = [ + migrations.AddField( + model_name='resourcetag', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='resourcetag', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='resource', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='resource', + name='tags', + field=models.ManyToManyField(related_name='resources', to='support.resourcetag', verbose_name='resource tags'), + ), + migrations.AddField( + model_name='resource', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='legaldocument', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='legaldocument', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='frequentlyaskedquestion', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='frequentlyaskedquestion', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='action', + name='context', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='context.context', verbose_name='context'), + ), + migrations.AddField( + model_name='action', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='action', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + ] diff --git a/support/migrations/0002_resource_resourcetag.py b/support/migrations/0002_resource_resourcetag.py deleted file mode 100644 index 1bf2322..0000000 --- a/support/migrations/0002_resource_resourcetag.py +++ /dev/null @@ -1,59 +0,0 @@ -# Generated by Django 3.2 on 2021-05-27 07:36 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('support', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='ResourceTag', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=50)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ('order',), - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Resource', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=255)), - ('title_en', models.CharField(max_length=255, null=True)), - ('title_es', models.CharField(max_length=255, null=True)), - ('title_fr', models.CharField(max_length=255, null=True)), - ('description', models.TextField()), - ('description_en', models.TextField(null=True)), - ('description_es', models.TextField(null=True)), - ('description_fr', models.TextField(null=True)), - ('resource_type', models.CharField(choices=[('attachment', 'Attachment'), ('video', 'Video')], max_length=10)), - ('video_url', models.URLField(blank=True, default=None, null=True)), - ('attachment', models.FileField(blank=True, default=None, null=True, upload_to='')), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('tags', models.ManyToManyField(related_name='resources', to='support.ResourceTag')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ('order',), - 'abstract': False, - }, - ), - ] diff --git a/support/migrations/0003_action.py b/support/migrations/0003_action.py deleted file mode 100644 index d3f808e..0000000 --- a/support/migrations/0003_action.py +++ /dev/null @@ -1,46 +0,0 @@ -# Generated by Django 3.2.3 on 2021-05-28 07:31 - -import ckeditor_uploader.fields -from django.conf import settings -import django.contrib.gis.db.models.fields -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('support', '0002_resource_resourcetag'), - ] - - operations = [ - migrations.CreateModel( - name='Action', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=255)), - ('title_en', models.CharField(max_length=255, null=True)), - ('title_es', models.CharField(max_length=255, null=True)), - ('title_fr', models.CharField(max_length=255, null=True)), - ('organization', models.CharField(max_length=255)), - ('summary', models.TextField()), - ('summary_en', models.TextField(null=True)), - ('summary_es', models.TextField(null=True)), - ('summary_fr', models.TextField(null=True)), - ('description', ckeditor_uploader.fields.RichTextUploadingField()), - ('description_en', ckeditor_uploader.fields.RichTextUploadingField(null=True)), - ('description_es', ckeditor_uploader.fields.RichTextUploadingField(null=True)), - ('description_fr', ckeditor_uploader.fields.RichTextUploadingField(null=True)), - ('point', django.contrib.gis.db.models.fields.PointField(srid=4326)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/support/migrations/0004_action_context.py b/support/migrations/0004_action_context.py deleted file mode 100644 index 1c3c6a7..0000000 --- a/support/migrations/0004_action_context.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2021-06-08 04:53 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0001_initial'), - ('support', '0003_action'), - ] - - operations = [ - migrations.AddField( - model_name='action', - name='context', - field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='context.context'), - ), - ] diff --git a/support/migrations/0005_alter_action_options.py b/support/migrations/0005_alter_action_options.py deleted file mode 100644 index 00904ae..0000000 --- a/support/migrations/0005_alter_action_options.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.4 on 2021-06-08 07:26 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('support', '0004_action_context'), - ] - - operations = [ - migrations.AlterModelOptions( - name='action', - options={'ordering': ('order',)}, - ), - ] diff --git a/support/migrations/0006_legaldocument.py b/support/migrations/0006_legaldocument.py deleted file mode 100644 index da4e608..0000000 --- a/support/migrations/0006_legaldocument.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 3.2.5 on 2021-07-28 06:13 - -import ckeditor.fields -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('support', '0005_alter_action_options'), - ] - - operations = [ - migrations.CreateModel( - name='LegalDocument', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('document_type', models.CharField(choices=[('terms-and-conditions', 'Terms And Conditions'), ('privacy-policy', 'Privacy Policy')], max_length=20, unique=True)), - ('description', ckeditor.fields.RichTextField()), - ('description_en', ckeditor.fields.RichTextField(null=True)), - ('description_es', ckeditor.fields.RichTextField(null=True)), - ('description_fr', ckeditor.fields.RichTextField(null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/support/migrations/0007_alter_legaldocument_document_type.py b/support/migrations/0007_alter_legaldocument_document_type.py deleted file mode 100644 index 286aed9..0000000 --- a/support/migrations/0007_alter_legaldocument_document_type.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.5 on 2021-07-29 05:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('support', '0006_legaldocument'), - ] - - operations = [ - migrations.AlterField( - model_name='legaldocument', - name='document_type', - field=models.CharField(choices=[('terms-and-conditions', 'Terms And Conditions'), ('privacy-policy', 'Privacy Policy'), ('cookie-policy', 'Cookie Policy')], max_length=20, unique=True), - ), - ] diff --git a/support/migrations/0008_emailtemplate.py b/support/migrations/0008_emailtemplate.py deleted file mode 100644 index 5b1c0d8..0000000 --- a/support/migrations/0008_emailtemplate.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.11 on 2022-02-09 12:04 - -import ckeditor.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('support', '0007_alter_legaldocument_document_type'), - ] - - operations = [ - migrations.CreateModel( - name='EmailTemplate', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('identifier', models.CharField(max_length=50, unique=True)), - ('subject', models.CharField(max_length=255)), - ('html_message', ckeditor.fields.RichTextField()), - ('text_message', models.TextField()), - ], - ), - ] diff --git a/support/migrations/0009_add_verbose_name.py b/support/migrations/0009_add_verbose_name.py deleted file mode 100644 index 783ed6c..0000000 --- a/support/migrations/0009_add_verbose_name.py +++ /dev/null @@ -1,345 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 14:40 - -import ckeditor.fields -import ckeditor_uploader.fields -from django.conf import settings -import django.contrib.gis.db.models.fields -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0002_add_verbose_name'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('support', '0008_emailtemplate'), - ] - - operations = [ - migrations.AlterField( - model_name='action', - name='context', - field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='context.context', verbose_name='context'), - ), - migrations.AlterField( - model_name='action', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='action', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='action', - name='description', - field=ckeditor_uploader.fields.RichTextUploadingField(verbose_name='description'), - ), - migrations.AlterField( - model_name='action', - name='description_en', - field=ckeditor_uploader.fields.RichTextUploadingField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='action', - name='description_es', - field=ckeditor_uploader.fields.RichTextUploadingField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='action', - name='description_fr', - field=ckeditor_uploader.fields.RichTextUploadingField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='action', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='action', - name='organization', - field=models.CharField(max_length=255, verbose_name='organization'), - ), - migrations.AlterField( - model_name='action', - name='point', - field=django.contrib.gis.db.models.fields.PointField(srid=4326, verbose_name='point'), - ), - migrations.AlterField( - model_name='action', - name='summary', - field=models.TextField(verbose_name='summary'), - ), - migrations.AlterField( - model_name='action', - name='summary_en', - field=models.TextField(null=True, verbose_name='summary'), - ), - migrations.AlterField( - model_name='action', - name='summary_es', - field=models.TextField(null=True, verbose_name='summary'), - ), - migrations.AlterField( - model_name='action', - name='summary_fr', - field=models.TextField(null=True, verbose_name='summary'), - ), - migrations.AlterField( - model_name='action', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='action', - name='title_en', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='action', - name='title_es', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='action', - name='title_fr', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='action', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='emailtemplate', - name='html_message', - field=ckeditor.fields.RichTextField(verbose_name='html mesaage'), - ), - migrations.AlterField( - model_name='emailtemplate', - name='identifier', - field=models.CharField(max_length=50, unique=True, verbose_name='identifier'), - ), - migrations.AlterField( - model_name='emailtemplate', - name='subject', - field=models.CharField(max_length=255, verbose_name='subject'), - ), - migrations.AlterField( - model_name='emailtemplate', - name='text_message', - field=models.TextField(verbose_name='text message'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='answer', - field=models.TextField(verbose_name='answer'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='answer_en', - field=models.TextField(null=True, verbose_name='answer'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='answer_es', - field=models.TextField(null=True, verbose_name='answer'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='answer_fr', - field=models.TextField(null=True, verbose_name='answer'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='question', - field=models.TextField(verbose_name='question'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='question_en', - field=models.TextField(null=True, verbose_name='question'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='question_es', - field=models.TextField(null=True, verbose_name='question'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='question_fr', - field=models.TextField(null=True, verbose_name='question'), - ), - migrations.AlterField( - model_name='frequentlyaskedquestion', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='legaldocument', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='legaldocument', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='legaldocument', - name='description', - field=ckeditor.fields.RichTextField(verbose_name='description'), - ), - migrations.AlterField( - model_name='legaldocument', - name='description_en', - field=ckeditor.fields.RichTextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='legaldocument', - name='description_es', - field=ckeditor.fields.RichTextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='legaldocument', - name='description_fr', - field=ckeditor.fields.RichTextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='legaldocument', - name='document_type', - field=models.CharField(choices=[('terms-and-conditions', 'Terms And Conditions'), ('privacy-policy', 'Privacy Policy'), ('cookie-policy', 'Cookie Policy')], max_length=20, unique=True, verbose_name='document type'), - ), - migrations.AlterField( - model_name='legaldocument', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='legaldocument', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='resource', - name='attachment', - field=models.FileField(blank=True, default=None, null=True, upload_to='', verbose_name='attachment'), - ), - migrations.AlterField( - model_name='resource', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='resource', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='resource', - name='description', - field=models.TextField(verbose_name='description'), - ), - migrations.AlterField( - model_name='resource', - name='description_en', - field=models.TextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='resource', - name='description_es', - field=models.TextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='resource', - name='description_fr', - field=models.TextField(null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='resource', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='resource', - name='resource_type', - field=models.CharField(choices=[('attachment', 'Attachment'), ('video', 'Video')], max_length=10, verbose_name='resource type'), - ), - migrations.AlterField( - model_name='resource', - name='tags', - field=models.ManyToManyField(related_name='resources', to='support.ResourceTag', verbose_name='resource tags'), - ), - migrations.AlterField( - model_name='resource', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='resource', - name='title_en', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='resource', - name='title_es', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='resource', - name='title_fr', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='resource', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='resource', - name='video_url', - field=models.URLField(blank=True, default=None, null=True, verbose_name='video url'), - ), - migrations.AlterField( - model_name='resourcetag', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='resourcetag', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='resourcetag', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='resourcetag', - name='title', - field=models.CharField(max_length=50, verbose_name='title'), - ), - migrations.AlterField( - model_name='resourcetag', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - ] diff --git a/support/migrations/0010_alter_emailtemplate_html_message.py b/support/migrations/0010_alter_emailtemplate_html_message.py deleted file mode 100644 index 73c5788..0000000 --- a/support/migrations/0010_alter_emailtemplate_html_message.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.13 on 2022-05-27 05:03 - -import ckeditor.fields -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('support', '0009_add_verbose_name'), - ] - - operations = [ - migrations.AlterField( - model_name='emailtemplate', - name='html_message', - field=ckeditor.fields.RichTextField(verbose_name='html message'), - ), - ] diff --git a/support/models.py b/support/models.py index 9a25539..7952692 100644 --- a/support/models.py +++ b/support/models.py @@ -1,5 +1,5 @@ -from ckeditor.fields import RichTextField -from ckeditor_uploader.fields import RichTextUploadingField +from django_ckeditor_5.fields import CKEditor5Field + from django.contrib.gis.db.models import PointField from django.db import models from django.template import Context, Template @@ -22,7 +22,7 @@ class LegalDocument(UserStampedModel, TimeStampedModel): choices=LegalDocumentTypeChoice.choices, unique=True, ) - description = RichTextField(_("description")) + description = CKEditor5Field(_("description")) def __str__(self): return self.document_type @@ -105,7 +105,7 @@ class Action(UserStampedModel, TimeStampedModel, OrderedModel): ) organization = models.CharField(_("organization"), max_length=255) summary = models.TextField(_("summary")) - description = RichTextUploadingField(_("description")) + description = CKEditor5Field(_("description")) point = PointField(_("point")) def __str__(self): @@ -118,7 +118,7 @@ class Meta(OrderedModel.Meta): class EmailTemplate(models.Model): identifier = models.CharField(_("identifier"), max_length=50, unique=True) subject = models.CharField(_("subject"), max_length=255) - html_message = RichTextField(_("html message")) + html_message = CKEditor5Field(_("html message")) text_message = models.TextField(_("text message")) def __str__(self): diff --git a/support/serializers.py b/support/serializers.py index 8aed612..ca3e9f3 100644 --- a/support/serializers.py +++ b/support/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from neatplus.serializers import RichTextUploadingModelSerializer, UserModelSerializer +from neatplus.serializers import UserModelSerializer from .models import ( Action, @@ -35,7 +35,7 @@ class Meta: fields = "__all__" -class ActionSerializer(RichTextUploadingModelSerializer, UserModelSerializer): +class ActionSerializer(UserModelSerializer): context_title = serializers.SerializerMethodField() class Meta: diff --git a/survey/migrations/0001_initial.py b/survey/migrations/0001_initial.py index 4c744af..28d8b5e 100644 --- a/survey/migrations/0001_initial.py +++ b/survey/migrations/0001_initial.py @@ -1,8 +1,7 @@ -# Generated by Django 3.2 on 2021-05-27 07:51 +# Generated by Django 4.2.17 on 2025-01-14 09:53 -from django.conf import settings from django.db import migrations, models -import django.db.models.deletion +import django_ckeditor_5.fields class Migration(migrations.Migration): @@ -10,9 +9,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('project', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('context', '0001_initial'), ] operations = [ @@ -21,14 +17,13 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('code', models.CharField(max_length=10, unique=True)), - ('title', models.TextField()), - ('title_en', models.TextField(null=True)), - ('title_es', models.TextField(null=True)), - ('title_fr', models.TextField(null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='code')), + ('title', models.TextField(verbose_name='title')), + ('title_en', models.TextField(null=True, verbose_name='title')), + ('title_es', models.TextField(null=True, verbose_name='title')), + ('title_fr', models.TextField(null=True, verbose_name='title')), ], options={ 'ordering': ('order',), @@ -40,24 +35,25 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('code', models.CharField(max_length=10, unique=True)), - ('title', models.TextField()), - ('title_en', models.TextField(null=True)), - ('title_es', models.TextField(null=True)), - ('title_fr', models.TextField(null=True)), - ('description', models.TextField(blank=True, default=None, null=True)), - ('description_en', models.TextField(blank=True, default=None, null=True)), - ('description_es', models.TextField(blank=True, default=None, null=True)), - ('description_fr', models.TextField(blank=True, default=None, null=True)), - ('hints', models.TextField(blank=True, default=None, null=True)), - ('hints_en', models.TextField(blank=True, default=None, null=True)), - ('hints_es', models.TextField(blank=True, default=None, null=True)), - ('hints_fr', models.TextField(blank=True, default=None, null=True)), - ('answer_type', models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('image', 'Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15)), - ('is_required', models.BooleanField(default=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='code')), + ('title', models.TextField(verbose_name='title')), + ('title_en', models.TextField(null=True, verbose_name='title')), + ('title_es', models.TextField(null=True, verbose_name='title')), + ('title_fr', models.TextField(null=True, verbose_name='title')), + ('description', django_ckeditor_5.fields.CKEditor5Field(blank=True, default='Write your queriers here..', null=True, verbose_name='description')), + ('description_en', django_ckeditor_5.fields.CKEditor5Field(blank=True, default='Write your queriers here..', null=True, verbose_name='description')), + ('description_es', django_ckeditor_5.fields.CKEditor5Field(blank=True, default='Write your queriers here..', null=True, verbose_name='description')), + ('description_fr', django_ckeditor_5.fields.CKEditor5Field(blank=True, default='Write your queriers here..', null=True, verbose_name='description')), + ('hints', models.TextField(blank=True, default=None, null=True, verbose_name='hints')), + ('hints_en', models.TextField(blank=True, default=None, null=True, verbose_name='hints')), + ('hints_es', models.TextField(blank=True, default=None, null=True, verbose_name='hints')), + ('hints_fr', models.TextField(blank=True, default=None, null=True, verbose_name='hints')), + ('answer_type', models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('single_image', 'Single Image'), ('multiple_image', 'Multiple Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15, verbose_name='answer type')), + ('is_required', models.BooleanField(default=True, verbose_name='required')), + ('skip_logic', models.TextField(blank=True, default=None, null=True, verbose_name='skip logic')), + ('acronym', models.CharField(blank=True, default=None, max_length=100, null=True, verbose_name='acronym')), ], options={ 'ordering': ('order',), @@ -65,16 +61,18 @@ class Migration(migrations.Migration): }, ), migrations.CreateModel( - name='Survey', + name='QuestionGroup', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=255)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.project')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='code')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_es', models.CharField(max_length=255, null=True, verbose_name='title')), + ('title_fr', models.CharField(max_length=255, null=True, verbose_name='title')), + ('skip_logic', models.TextField(blank=True, default=None, null=True, verbose_name='skip logic')), ], options={ 'ordering': ('order',), @@ -82,65 +80,30 @@ class Migration(migrations.Migration): }, ), migrations.CreateModel( - name='SurveyAnswer', + name='Survey', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('answer', models.TextField(blank=True, default=None, null=True)), - ('answer_type', models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('image', 'Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('options', models.ManyToManyField(blank=True, to='survey.Option')), - ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.question')), - ('survey', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='survey.survey')), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('config', models.JSONField(blank=True, default=dict, verbose_name='config')), + ('is_shared_publicly', models.BooleanField(default=False, verbose_name='shared publicly')), + ('shared_link_identifier', models.CharField(blank=True, default=None, editable=False, max_length=10, null=True, unique=True, verbose_name='shared link identifier')), ], options={ + 'ordering': ('order',), 'abstract': False, }, ), migrations.CreateModel( - name='QuestionGroup', + name='SurveyAnswer', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(db_index=True, editable=False, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('code', models.CharField(max_length=10, unique=True)), - ('title', models.CharField(max_length=255)), - ('title_en', models.CharField(max_length=255, null=True)), - ('title_es', models.CharField(max_length=255, null=True)), - ('title_fr', models.CharField(max_length=255, null=True)), - ('created_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('updated_by', models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('answer', models.TextField(blank=True, default=None, null=True, verbose_name='answer')), + ('answer_type', models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('single_image', 'Single Image'), ('multiple_image', 'Multiple Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15, verbose_name='answer type')), ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='question', - name='group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='survey.questiongroup'), - ), - migrations.AddField( - model_name='question', - name='module', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='questions', to='context.module'), - ), - migrations.AddField( - model_name='question', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='option', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to='survey.question'), - ), - migrations.AddField( - model_name='option', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL), ), ] diff --git a/survey/migrations/0002_add_skip_logic.py b/survey/migrations/0002_add_skip_logic.py deleted file mode 100644 index d167e53..0000000 --- a/survey/migrations/0002_add_skip_logic.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 3.2.3 on 2021-06-02 07:20 - -import ckeditor_uploader.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='question', - name='skip_logic', - field=models.TextField(blank=True, default=None, null=True), - ), - migrations.AddField( - model_name='questiongroup', - name='skip_logic', - field=models.TextField(blank=True, default=None, null=True), - ), - migrations.AlterField( - model_name='question', - name='description', - field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, default=None, null=True), - ), - migrations.AlterField( - model_name='question', - name='description_en', - field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, default=None, null=True), - ), - migrations.AlterField( - model_name='question', - name='description_es', - field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, default=None, null=True), - ), - migrations.AlterField( - model_name='question', - name='description_fr', - field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, default=None, null=True), - ), - ] diff --git a/survey/migrations/0002_initial.py b/survey/migrations/0002_initial.py new file mode 100644 index 0000000..abc92e3 --- /dev/null +++ b/survey/migrations/0002_initial.py @@ -0,0 +1,109 @@ +# Generated by Django 4.2.17 on 2025-01-14 09:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('survey', '0001_initial'), + ('project', '0002_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('context', '0002_initial'), + ] + + operations = [ + migrations.AddField( + model_name='surveyanswer', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='surveyanswer', + name='options', + field=models.ManyToManyField(blank=True, related_name='survey_answers', to='survey.option', verbose_name='options'), + ), + migrations.AddField( + model_name='surveyanswer', + name='question', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.question', verbose_name='question'), + ), + migrations.AddField( + model_name='surveyanswer', + name='survey', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='survey.survey', verbose_name='survey'), + ), + migrations.AddField( + model_name='surveyanswer', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='survey', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='survey', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='surveys', to='project.project', verbose_name='project'), + ), + migrations.AddField( + model_name='survey', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='questiongroup', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='questiongroup', + name='module', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='question_groups', to='context.module', verbose_name='module'), + ), + migrations.AddField( + model_name='questiongroup', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='question', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='question', + name='group', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='survey.questiongroup', verbose_name='question group'), + ), + migrations.AddField( + model_name='question', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddField( + model_name='option', + name='created_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + ), + migrations.AddField( + model_name='option', + name='question', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to='survey.question', verbose_name='question'), + ), + migrations.AddField( + model_name='option', + name='updated_by', + field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), + ), + migrations.AddConstraint( + model_name='surveyanswer', + constraint=models.UniqueConstraint(fields=('question', 'survey'), name='unique_survey_question'), + ), + ] diff --git a/survey/migrations/0003_survey_config.py b/survey/migrations/0003_survey_config.py deleted file mode 100644 index 86654a3..0000000 --- a/survey/migrations/0003_survey_config.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2021-06-29 09:41 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0002_add_skip_logic'), - ] - - operations = [ - migrations.AddField( - model_name='survey', - name='config', - field=models.JSONField(default=dict), - ), - ] diff --git a/survey/migrations/0004_share_survey_publicly.py b/survey/migrations/0004_share_survey_publicly.py deleted file mode 100644 index cf84bdb..0000000 --- a/survey/migrations/0004_share_survey_publicly.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 3.2.5 on 2021-07-14 08:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0003_survey_config'), - ] - - operations = [ - migrations.AlterModelOptions( - name='questiongroup', - options={'ordering': ('order',)}, - ), - migrations.AddField( - model_name='survey', - name='is_shared_publicly', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='survey', - name='shared_link_identifier', - field=models.CharField(blank=True, default=None, editable=False, max_length=10, null=True, unique=True), - ), - ] diff --git a/survey/migrations/0005_question_acronym.py b/survey/migrations/0005_question_acronym.py deleted file mode 100644 index d0ec14a..0000000 --- a/survey/migrations/0005_question_acronym.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.5 on 2021-07-21 05:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0004_share_survey_publicly'), - ] - - operations = [ - migrations.AddField( - model_name='question', - name='acronym', - field=models.CharField(blank=True, default=None, max_length=50, null=True), - ), - ] diff --git a/survey/migrations/0006_alter_question_acronym.py b/survey/migrations/0006_alter_question_acronym.py deleted file mode 100644 index 5a163ec..0000000 --- a/survey/migrations/0006_alter_question_acronym.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.5 on 2021-07-26 05:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0005_question_acronym'), - ] - - operations = [ - migrations.AlterField( - model_name='question', - name='acronym', - field=models.CharField(blank=True, default=None, max_length=100, null=True), - ), - ] diff --git a/survey/migrations/0007_multiple_image_answer.py b/survey/migrations/0007_multiple_image_answer.py deleted file mode 100644 index 2710595..0000000 --- a/survey/migrations/0007_multiple_image_answer.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.7 on 2021-09-14 08:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0006_alter_question_acronym'), - ] - - operations = [ - migrations.AlterField( - model_name='question', - name='answer_type', - field=models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('image', 'Image'), ('single_image', 'Single Image'), ('multiple_image', 'Multiple Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15), - ), - migrations.AlterField( - model_name='surveyanswer', - name='answer_type', - field=models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('image', 'Image'), ('single_image', 'Single Image'), ('multiple_image', 'Multiple Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15), - ), - ] diff --git a/survey/migrations/0008_image_to_single_image_migrate.py b/survey/migrations/0008_image_to_single_image_migrate.py deleted file mode 100644 index 3ebd5eb..0000000 --- a/survey/migrations/0008_image_to_single_image_migrate.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.2.7 on 2021-09-14 08:43 - -from django.db import migrations - -def forward_migration(apps, schema_editor): - Question = apps.get_model('survey', 'Question') - SurveyAnswer = apps.get_model('survey', 'SurveyAnswer') - Question.objects.filter(answer_type='image').update(answer_type='single_image') - SurveyAnswer.objects.filter(answer_type='image').update(answer_type='single_image') - -def backward_migration(apps, schema_editor): - Question = apps.get_model('survey', 'Question') - SurveyAnswer = apps.get_model('survey', 'SurveyAnswer') - Question.objects.filter(answer_type='single_image').update(answer_type='image') - SurveyAnswer.objects.filter(answer_type='single_image').update(answer_type='image') - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0007_multiple_image_answer'), - ] - - operations = [ - migrations.RunPython(forward_migration, backward_migration) - ] diff --git a/survey/migrations/0009_remove_image_choice.py b/survey/migrations/0009_remove_image_choice.py deleted file mode 100644 index 248b83a..0000000 --- a/survey/migrations/0009_remove_image_choice.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.7 on 2021-09-14 08:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0008_image_to_single_image_migrate'), - ] - - operations = [ - migrations.AlterField( - model_name='question', - name='answer_type', - field=models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('single_image', 'Single Image'), ('multiple_image', 'Multiple Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15), - ), - migrations.AlterField( - model_name='surveyanswer', - name='answer_type', - field=models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('single_image', 'Single Image'), ('multiple_image', 'Multiple Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15), - ), - ] diff --git a/survey/migrations/0010_add_verbose_name.py b/survey/migrations/0010_add_verbose_name.py deleted file mode 100644 index f614ea3..0000000 --- a/survey/migrations/0010_add_verbose_name.py +++ /dev/null @@ -1,324 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 14:40 - -import ckeditor_uploader.fields -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0002_add_verbose_name'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('project', '0004_add_verbose_name'), - ('survey', '0009_remove_image_choice'), - ] - - operations = [ - migrations.AlterField( - model_name='option', - name='code', - field=models.CharField(max_length=10, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='option', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='option', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='option', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='option', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to='survey.question', verbose_name='question'), - ), - migrations.AlterField( - model_name='option', - name='title', - field=models.TextField(verbose_name='title'), - ), - migrations.AlterField( - model_name='option', - name='title_en', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='option', - name='title_es', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='option', - name='title_fr', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='option', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='question', - name='acronym', - field=models.CharField(blank=True, default=None, max_length=100, null=True, verbose_name='acronym'), - ), - migrations.AlterField( - model_name='question', - name='answer_type', - field=models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('single_image', 'Single Image'), ('multiple_image', 'Multiple Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15, verbose_name='answer type'), - ), - migrations.AlterField( - model_name='question', - name='code', - field=models.CharField(max_length=10, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='question', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='question', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='question', - name='description', - field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='question', - name='description_en', - field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='question', - name='description_es', - field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='question', - name='description_fr', - field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, default=None, null=True, verbose_name='description'), - ), - migrations.AlterField( - model_name='question', - name='group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='survey.questiongroup', verbose_name='question group'), - ), - migrations.AlterField( - model_name='question', - name='hints', - field=models.TextField(blank=True, default=None, null=True, verbose_name='hints'), - ), - migrations.AlterField( - model_name='question', - name='hints_en', - field=models.TextField(blank=True, default=None, null=True, verbose_name='hints'), - ), - migrations.AlterField( - model_name='question', - name='hints_es', - field=models.TextField(blank=True, default=None, null=True, verbose_name='hints'), - ), - migrations.AlterField( - model_name='question', - name='hints_fr', - field=models.TextField(blank=True, default=None, null=True, verbose_name='hints'), - ), - migrations.AlterField( - model_name='question', - name='is_required', - field=models.BooleanField(default=True, verbose_name='required'), - ), - migrations.AlterField( - model_name='question', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='question', - name='module', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='questions', to='context.module', verbose_name='module'), - ), - migrations.AlterField( - model_name='question', - name='skip_logic', - field=models.TextField(blank=True, default=None, null=True, verbose_name='skip logic'), - ), - migrations.AlterField( - model_name='question', - name='title', - field=models.TextField(verbose_name='title'), - ), - migrations.AlterField( - model_name='question', - name='title_en', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='question', - name='title_es', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='question', - name='title_fr', - field=models.TextField(null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='question', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='questiongroup', - name='code', - field=models.CharField(max_length=10, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='questiongroup', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='questiongroup', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='questiongroup', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='questiongroup', - name='skip_logic', - field=models.TextField(blank=True, default=None, null=True, verbose_name='skip logic'), - ), - migrations.AlterField( - model_name='questiongroup', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='questiongroup', - name='title_en', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='questiongroup', - name='title_es', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='questiongroup', - name='title_fr', - field=models.CharField(max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='questiongroup', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='survey', - name='config', - field=models.JSONField(default=dict, verbose_name='config'), - ), - migrations.AlterField( - model_name='survey', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='survey', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='survey', - name='is_shared_publicly', - field=models.BooleanField(default=False, verbose_name='shared publicly'), - ), - migrations.AlterField( - model_name='survey', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='survey', - name='project', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='surveys', to='project.project', verbose_name='project'), - ), - migrations.AlterField( - model_name='survey', - name='shared_link_identifier', - field=models.CharField(blank=True, default=None, editable=False, max_length=10, null=True, unique=True, verbose_name='shared link identifier'), - ), - migrations.AlterField( - model_name='survey', - name='title', - field=models.CharField(max_length=255, verbose_name='title'), - ), - migrations.AlterField( - model_name='survey', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - migrations.AlterField( - model_name='surveyanswer', - name='answer', - field=models.TextField(blank=True, default=None, null=True, verbose_name='answer'), - ), - migrations.AlterField( - model_name='surveyanswer', - name='answer_type', - field=models.CharField(choices=[('boolean', 'Boolean'), ('date', 'Date'), ('description', 'Description'), ('single_image', 'Single Image'), ('multiple_image', 'Multiple Image'), ('location', 'Location'), ('number', 'Number'), ('text', 'Text'), ('single_option', 'Single Option'), ('multiple_option', 'Multiple Option')], max_length=15, verbose_name='answer type'), - ), - migrations.AlterField( - model_name='surveyanswer', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='surveyanswer', - name='created_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by'), - ), - migrations.AlterField( - model_name='surveyanswer', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='surveyanswer', - name='options', - field=models.ManyToManyField(blank=True, to='survey.Option', verbose_name='options'), - ), - migrations.AlterField( - model_name='surveyanswer', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='survey.question', verbose_name='question'), - ), - migrations.AlterField( - model_name='surveyanswer', - name='survey', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='survey.survey', verbose_name='survey'), - ), - migrations.AlterField( - model_name='surveyanswer', - name='updated_by', - field=models.ForeignKey(blank=True, default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='updated by'), - ), - ] diff --git a/survey/migrations/0011_increase_code_max_length.py b/survey/migrations/0011_increase_code_max_length.py deleted file mode 100644 index 0073b45..0000000 --- a/survey/migrations/0011_increase_code_max_length.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-18 04:52 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0010_add_verbose_name'), - ] - - operations = [ - migrations.AlterField( - model_name='option', - name='code', - field=models.CharField(max_length=50, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='question', - name='code', - field=models.CharField(max_length=50, unique=True, verbose_name='code'), - ), - migrations.AlterField( - model_name='questiongroup', - name='code', - field=models.CharField(max_length=50, unique=True, verbose_name='code'), - ), - ] diff --git a/survey/migrations/0012_surveyanswer_unique_survey_question.py b/survey/migrations/0012_surveyanswer_unique_survey_question.py deleted file mode 100644 index c55ca11..0000000 --- a/survey/migrations/0012_surveyanswer_unique_survey_question.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-24 08:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0011_increase_code_max_length'), - ] - - operations = [ - migrations.AddConstraint( - model_name='surveyanswer', - constraint=models.UniqueConstraint(fields=('question', 'survey'), name='unique_survey_question'), - ), - ] diff --git a/survey/migrations/0013_option_mitigation_opportunity_json_field.py b/survey/migrations/0013_option_mitigation_opportunity_json_field.py deleted file mode 100644 index 144ac4d..0000000 --- a/survey/migrations/0013_option_mitigation_opportunity_json_field.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-03 05:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0012_surveyanswer_unique_survey_question'), - ] - - operations = [ - migrations.AddField( - model_name='option', - name='mitigation', - field=models.JSONField(default=list, verbose_name='mitigations'), - preserve_default=False, - ), - migrations.AddField( - model_name='option', - name='opportunity', - field=models.JSONField(default=list, verbose_name='opportunities'), - preserve_default=False, - ), - ] diff --git a/survey/migrations/0014_questiongroup_module.py b/survey/migrations/0014_questiongroup_module.py deleted file mode 100644 index 3508ec3..0000000 --- a/survey/migrations/0014_questiongroup_module.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-23 05:41 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0003_increase_code_max_length'), - ('survey', '0013_option_mitigation_opportunity_json_field'), - ] - - operations = [ - migrations.AddField( - model_name='questiongroup', - name='module', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='question_groups', to='context.module', verbose_name='module'), - ), - ] diff --git a/survey/migrations/0015_set_question_group_module.py b/survey/migrations/0015_set_question_group_module.py deleted file mode 100644 index fd05aae..0000000 --- a/survey/migrations/0015_set_question_group_module.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-23 05:42 - -from django.db import migrations -from django.db.migrations import exceptions - - -def forward_migration(apps, schema_editor): - QuestionGroup = apps.get_model('survey', 'QuestionGroup') - for group in QuestionGroup.objects.all(): - modules = group.questions.values('module_id').distinct() - if modules.count() != 1: - raise exceptions.InvalidMigrationPlan( - f"Group {group.pk} question doesn't have exactly one module" - ) - group.module_id = modules.first()["module_id"] - group.save() - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0014_questiongroup_module'), - ] - - operations = [ - migrations.RunPython(forward_migration, migrations.RunPython.noop) - ] diff --git a/survey/migrations/0016_remove_question_module.py b/survey/migrations/0016_remove_question_module.py deleted file mode 100644 index 4aea04f..0000000 --- a/survey/migrations/0016_remove_question_module.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-23 06:11 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('context', '0003_increase_code_max_length'), - ('survey', '0015_set_question_group_module'), - ] - - operations = [ - migrations.RemoveField( - model_name='question', - name='module', - ), - migrations.AlterField( - model_name='questiongroup', - name='module', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='question_groups', to='context.module', verbose_name='module'), - ), - ] diff --git a/survey/migrations/0017_json_field_blank_true_default.py b/survey/migrations/0017_json_field_blank_true_default.py deleted file mode 100644 index 2e12b37..0000000 --- a/survey/migrations/0017_json_field_blank_true_default.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.16 on 2023-01-16 09:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0016_remove_question_module'), - ] - - operations = [ - migrations.AlterField( - model_name='option', - name='mitigation', - field=models.JSONField(blank=True, default=list, verbose_name='mitigations'), - ), - migrations.AlterField( - model_name='option', - name='opportunity', - field=models.JSONField(blank=True, default=list, verbose_name='opportunities'), - ), - migrations.AlterField( - model_name='survey', - name='config', - field=models.JSONField(blank=True, default=dict, verbose_name='config'), - ), - ] diff --git a/survey/migrations/0018_remove_option_json_field.py b/survey/migrations/0018_remove_option_json_field.py deleted file mode 100644 index 66033cc..0000000 --- a/survey/migrations/0018_remove_option_json_field.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 3.2.18 on 2023-02-28 11:30 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0017_json_field_blank_true_default'), - ] - - operations = [ - migrations.RemoveField( - model_name='option', - name='mitigation', - ), - migrations.RemoveField( - model_name='option', - name='opportunity', - ), - ] diff --git a/survey/migrations/0019_alter_surveyanswer_options.py b/survey/migrations/0019_alter_surveyanswer_options.py deleted file mode 100644 index de24938..0000000 --- a/survey/migrations/0019_alter_surveyanswer_options.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.18 on 2023-03-06 02:10 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('survey', '0018_remove_option_json_field'), - ] - - operations = [ - migrations.AlterField( - model_name='surveyanswer', - name='options', - field=models.ManyToManyField(blank=True, related_name='survey_answers', to='survey.Option', verbose_name='options'), - ), - ] diff --git a/survey/models.py b/survey/models.py index 80fafd6..632ac6c 100644 --- a/survey/models.py +++ b/survey/models.py @@ -1,4 +1,4 @@ -from ckeditor_uploader.fields import RichTextUploadingField +from django_ckeditor_5.fields import CKEditor5Field from django.db import models from django.utils.translation import gettext_lazy as _ from ordered_model.models import OrderedModel @@ -38,9 +38,7 @@ class AnswerTypeChoices(models.TextChoices): class Question(CodeModel, UserStampedModel, TimeStampedModel, OrderedModel): title = models.TextField(_("title")) - description = RichTextUploadingField( - _("description"), blank=True, null=True, default=None - ) + description = CKEditor5Field(_("description"), blank=True, null=True, default=None) hints = models.TextField(_("hints"), blank=True, null=True, default=None) answer_type = models.CharField( _("answer type"), max_length=15, choices=AnswerTypeChoices.choices diff --git a/survey/serializers.py b/survey/serializers.py index 41a3e37..1704c3d 100644 --- a/survey/serializers.py +++ b/survey/serializers.py @@ -5,7 +5,7 @@ from rest_framework.fields import ImageField from rest_framework_gis.fields import GeometryField -from neatplus.serializers import RichTextUploadingModelSerializer, UserModelSerializer +from neatplus.serializers import UserModelSerializer from summary.serializers import SurveyResultSerializer from .models import ( @@ -24,7 +24,7 @@ class Meta: fields = "__all__" -class QuestionSerializer(RichTextUploadingModelSerializer, UserModelSerializer): +class QuestionSerializer(UserModelSerializer): # Added at 2022-03-23. Added for backward compatibility. # TODO: Remove it after some time if frontend is not using module = serializers.SerializerMethodField(read_only=True) diff --git a/user/migrations/0001_initial.py b/user/migrations/0001_initial.py index 4ac13c8..7a383aa 100644 --- a/user/migrations/0001_initial.py +++ b/user/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2 on 2021-04-27 05:01 +# Generated by Django 4.2.17 on 2025-01-14 09:53 from django.conf import settings import django.core.validators @@ -33,8 +33,11 @@ class Migration(migrations.Migration): ('username', neatplus.fields.LowerCharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. Length can be between 5 to 20. Letters, digits and ./-/_ only.', max_length=20, unique=True, validators=[user.auth_validators.CustomASCIIUsernameValidator(), django.core.validators.MinLengthValidator(limit_value=5)], verbose_name='username')), ('email', neatplus.fields.LowerEmailField(error_messages={'unique': 'A user with that email already exists.'}, max_length=254, unique=True, verbose_name='email address')), ('is_active', models.BooleanField(default=False, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('groups', 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')), - ('user_permissions', 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')), + ('organization', models.CharField(blank=True, default=None, max_length=255, null=True, verbose_name='organization')), + ('role', models.CharField(blank=True, default=None, max_length=50, null=True, verbose_name='role')), + ('has_accepted_terms_and_privacy_policy', models.BooleanField(default=True, verbose_name='accepted terms and privacy policy')), + ('groups', 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')), + ('user_permissions', 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')), ], options={ 'verbose_name': 'user', @@ -45,18 +48,31 @@ class Migration(migrations.Migration): ('objects', user.managers.CustomUserManager()), ], ), + migrations.CreateModel( + name='UserOldPassword', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_passwords', to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'abstract': False, + }, + ), migrations.CreateModel( name='PasswordResetPin', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('no_of_incorrect_attempts', models.PositiveIntegerField(default=0)), - ('pin', models.PositiveIntegerField(validators=[django.core.validators.MinLengthValidator(6), django.core.validators.MaxLengthValidator(6)])), - ('pin_expiry_time', models.DateTimeField()), - ('is_active', models.BooleanField(default=True)), - ('identifier', models.CharField(max_length=16)), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='password_reset_pin', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('no_of_incorrect_attempts', models.PositiveIntegerField(default=0, verbose_name='number of incorrect attempts')), + ('pin', models.PositiveIntegerField(validators=[django.core.validators.MinLengthValidator(6), django.core.validators.MaxLengthValidator(6)], verbose_name='pin')), + ('pin_expiry_time', models.DateTimeField(verbose_name='pin expiry time')), + ('is_active', models.BooleanField(default=True, verbose_name='active')), + ('identifier', models.CharField(max_length=16, verbose_name='identifier')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='password_reset_pin', to=settings.AUTH_USER_MODEL, verbose_name='user')), ], options={ 'abstract': False, @@ -66,13 +82,30 @@ class Migration(migrations.Migration): name='EmailConfirmationPin', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('no_of_incorrect_attempts', models.PositiveIntegerField(default=0)), - ('pin', models.PositiveIntegerField(validators=[django.core.validators.MinLengthValidator(6), django.core.validators.MaxLengthValidator(6)])), - ('pin_expiry_time', models.DateTimeField()), - ('is_active', models.BooleanField(default=True)), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='email_confirm_pin', to=settings.AUTH_USER_MODEL)), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('no_of_incorrect_attempts', models.PositiveIntegerField(default=0, verbose_name='number of incorrect attempts')), + ('pin', models.PositiveIntegerField(validators=[django.core.validators.MinLengthValidator(6), django.core.validators.MaxLengthValidator(6)], verbose_name='pin')), + ('pin_expiry_time', models.DateTimeField(verbose_name='pin expiry time')), + ('is_active', models.BooleanField(default=True, verbose_name='active')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='email_confirm_pin', to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='EmailChangePin', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('no_of_incorrect_attempts', models.PositiveIntegerField(default=0, verbose_name='number of incorrect attempts')), + ('pin', models.PositiveIntegerField(validators=[django.core.validators.MinLengthValidator(6), django.core.validators.MaxLengthValidator(6)], verbose_name='pin')), + ('pin_expiry_time', models.DateTimeField(verbose_name='pin expiry time')), + ('new_email', neatplus.fields.LowerEmailField(max_length=254, verbose_name='new email')), + ('is_active', models.BooleanField(default=True, verbose_name='active')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='email_change_pin', to=settings.AUTH_USER_MODEL, verbose_name='user')), ], options={ 'abstract': False, diff --git a/user/migrations/0002_add_user_organization_role.py b/user/migrations/0002_add_user_organization_role.py deleted file mode 100644 index 79c53c2..0000000 --- a/user/migrations/0002_add_user_organization_role.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2 on 2021-05-12 04:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('user', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='organization', - field=models.CharField(blank=True, default=None, max_length=255, null=True), - ), - migrations.AddField( - model_name='user', - name='role', - field=models.CharField(blank=True, default=None, max_length=50, null=True), - ), - ] diff --git a/user/migrations/0003_user_has_accepted_terms_and_privacy_policy.py b/user/migrations/0003_user_has_accepted_terms_and_privacy_policy.py deleted file mode 100644 index 8e17be1..0000000 --- a/user/migrations/0003_user_has_accepted_terms_and_privacy_policy.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.5 on 2021-07-26 09:42 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('user', '0002_add_user_organization_role'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='has_accepted_terms_and_privacy_policy', - field=models.BooleanField(default=True), - ), - ] diff --git a/user/migrations/0004_emailchangepin.py b/user/migrations/0004_emailchangepin.py deleted file mode 100644 index 627e77d..0000000 --- a/user/migrations/0004_emailchangepin.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 3.2.5 on 2021-08-03 05:24 - -from django.conf import settings -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion -import neatplus.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('user', '0003_user_has_accepted_terms_and_privacy_policy'), - ] - - operations = [ - migrations.CreateModel( - name='EmailChangePin', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('no_of_incorrect_attempts', models.PositiveIntegerField(default=0)), - ('pin', models.PositiveIntegerField(validators=[django.core.validators.MinLengthValidator(6), django.core.validators.MaxLengthValidator(6)])), - ('pin_expiry_time', models.DateTimeField()), - ('new_email', neatplus.fields.LowerEmailField(max_length=254)), - ('is_active', models.BooleanField(default=True)), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='email_change_pin', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/user/migrations/0005_useroldpassword.py b/user/migrations/0005_useroldpassword.py deleted file mode 100644 index c74838c..0000000 --- a/user/migrations/0005_useroldpassword.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.8 on 2021-10-18 05:28 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('user', '0004_emailchangepin'), - ] - - operations = [ - migrations.CreateModel( - name='UserOldPassword', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('password', models.CharField(max_length=128)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_passwords', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/user/migrations/0006_add_verbose_name.py b/user/migrations/0006_add_verbose_name.py deleted file mode 100644 index 91e8091..0000000 --- a/user/migrations/0006_add_verbose_name.py +++ /dev/null @@ -1,167 +0,0 @@ -# Generated by Django 3.2.12 on 2022-02-10 14:40 - -from django.conf import settings -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion -import neatplus.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('user', '0005_useroldpassword'), - ] - - operations = [ - migrations.AlterField( - model_name='emailchangepin', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='emailchangepin', - name='is_active', - field=models.BooleanField(default=True, verbose_name='active'), - ), - migrations.AlterField( - model_name='emailchangepin', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='emailchangepin', - name='new_email', - field=neatplus.fields.LowerEmailField(max_length=254, verbose_name='new email'), - ), - migrations.AlterField( - model_name='emailchangepin', - name='no_of_incorrect_attempts', - field=models.PositiveIntegerField(default=0, verbose_name='number of incorrect attempts'), - ), - migrations.AlterField( - model_name='emailchangepin', - name='pin', - field=models.PositiveIntegerField(validators=[django.core.validators.MinLengthValidator(6), django.core.validators.MaxLengthValidator(6)], verbose_name='pin'), - ), - migrations.AlterField( - model_name='emailchangepin', - name='pin_expiry_time', - field=models.DateTimeField(verbose_name='pin expiry time'), - ), - migrations.AlterField( - model_name='emailchangepin', - name='user', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='email_change_pin', to=settings.AUTH_USER_MODEL, verbose_name='user'), - ), - migrations.AlterField( - model_name='emailconfirmationpin', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='emailconfirmationpin', - name='is_active', - field=models.BooleanField(default=True, verbose_name='active'), - ), - migrations.AlterField( - model_name='emailconfirmationpin', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='emailconfirmationpin', - name='no_of_incorrect_attempts', - field=models.PositiveIntegerField(default=0, verbose_name='number of incorrect attempts'), - ), - migrations.AlterField( - model_name='emailconfirmationpin', - name='pin', - field=models.PositiveIntegerField(validators=[django.core.validators.MinLengthValidator(6), django.core.validators.MaxLengthValidator(6)], verbose_name='pin'), - ), - migrations.AlterField( - model_name='emailconfirmationpin', - name='pin_expiry_time', - field=models.DateTimeField(verbose_name='pin expiry time'), - ), - migrations.AlterField( - model_name='emailconfirmationpin', - name='user', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='email_confirm_pin', to=settings.AUTH_USER_MODEL, verbose_name='user'), - ), - migrations.AlterField( - model_name='passwordresetpin', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='passwordresetpin', - name='identifier', - field=models.CharField(max_length=16, verbose_name='identifier'), - ), - migrations.AlterField( - model_name='passwordresetpin', - name='is_active', - field=models.BooleanField(default=True, verbose_name='active'), - ), - migrations.AlterField( - model_name='passwordresetpin', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='passwordresetpin', - name='no_of_incorrect_attempts', - field=models.PositiveIntegerField(default=0, verbose_name='number of incorrect attempts'), - ), - migrations.AlterField( - model_name='passwordresetpin', - name='pin', - field=models.PositiveIntegerField(validators=[django.core.validators.MinLengthValidator(6), django.core.validators.MaxLengthValidator(6)], verbose_name='pin'), - ), - migrations.AlterField( - model_name='passwordresetpin', - name='pin_expiry_time', - field=models.DateTimeField(verbose_name='pin expiry time'), - ), - migrations.AlterField( - model_name='passwordresetpin', - name='user', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='password_reset_pin', to=settings.AUTH_USER_MODEL, verbose_name='user'), - ), - migrations.AlterField( - model_name='user', - name='has_accepted_terms_and_privacy_policy', - field=models.BooleanField(default=True, verbose_name='accepted terms and privacy policy'), - ), - migrations.AlterField( - model_name='user', - name='organization', - field=models.CharField(blank=True, default=None, max_length=255, null=True, verbose_name='organization'), - ), - migrations.AlterField( - model_name='user', - name='role', - field=models.CharField(blank=True, default=None, max_length=50, null=True, verbose_name='role'), - ), - migrations.AlterField( - model_name='useroldpassword', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), - ), - migrations.AlterField( - model_name='useroldpassword', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), - ), - migrations.AlterField( - model_name='useroldpassword', - name='password', - field=models.CharField(max_length=128, verbose_name='password'), - ), - migrations.AlterField( - model_name='useroldpassword', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_passwords', to=settings.AUTH_USER_MODEL, verbose_name='user'), - ), - ] diff --git a/uv.lock b/uv.lock index 269b677..e03bde9 100644 --- a/uv.lock +++ b/uv.lock @@ -331,16 +331,16 @@ wheels = [ ] [[package]] -name = "django-ckeditor" -version = "6.7.2" +name = "django-ckeditor-5" +version = "0.2.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django" }, - { name = "django-js-asset" }, + { name = "pillow" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/ad/73c303e8e58b38ef4f3ed475334dca2cd4509b4bbdfb573f2d13745e3cd8/django_ckeditor-6.7.2.tar.gz", hash = "sha256:a66be4f0ca13924d756e4930260144b31df4164eae8b942ca610f4313df00d5f", size = 1726242 } +sdist = { url = "https://files.pythonhosted.org/packages/58/61/86d285a9b690c785393083e4d3604ac07c8ec5360dca92ca3f6701c0a8b4/django_ckeditor_5-0.2.15.tar.gz", hash = "sha256:587f0485a3dca6a1a7c7c68e4160770e46389b8cf50205bf352bd47fcb63567c", size = 2563275 } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/ed/e48cc43a987facd99e7ad24cc466e2578b0cbdba345a01f068d55daa2a1a/django_ckeditor-6.7.2-py3-none-any.whl", hash = "sha256:2b3f147ce21eba861db481683e9a4639c11f0ad1f0d37c179003ef07f9eb65a4", size = 2455602 }, + { url = "https://files.pythonhosted.org/packages/59/ac/771a22ff54cd9e7f252a4a4f431fc638153dfa89f386537394e90a508ea6/django_ckeditor_5-0.2.15-py3-none-any.whl", hash = "sha256:71980998d4bef7b272e50cb6878cca5c0bedec42b389a3827ffe1bbb88babd29", size = 2603644 }, ] [[package]] @@ -822,7 +822,7 @@ dependencies = [ { name = "django" }, { name = "django-admin-autocomplete-filter" }, { name = "django-admin-interface" }, - { name = "django-ckeditor" }, + { name = "django-ckeditor-5" }, { name = "django-cors-headers" }, { name = "django-defender" }, { name = "django-filter" }, @@ -874,7 +874,7 @@ requires-dist = [ { name = "django", specifier = ">=4.2.16,<5.0.0" }, { name = "django-admin-autocomplete-filter", specifier = ">=0.7.1,<0.8.0" }, { name = "django-admin-interface", specifier = ">=0.29.2,<0.30.0" }, - { name = "django-ckeditor", specifier = ">=6.7.1,<7.0.0" }, + { name = "django-ckeditor-5", specifier = ">=0.2.15" }, { name = "django-cors-headers", specifier = ">=4.6.0,<5.0.0" }, { name = "django-defender", specifier = ">=0.9.8,<0.10" }, { name = "django-filter", specifier = ">=24.3,<25.0" },