From 31a387b1b936ef8fa808af3ddf0110b876ad8d2e Mon Sep 17 00:00:00 2001 From: Sushil Tiwari Date: Fri, 12 Jul 2024 10:29:40 +0545 Subject: [PATCH] Add mock response and factories --- per/factories.py | 41 ++++++++ .../create_dummy_opslearningsummary.py | 64 +++++++++++++ .../0121_opslearningcacheresponse_and_more.py | 96 ++++++++++++------- per/models.py | 6 +- per/serializers.py | 16 ++-- 5 files changed, 182 insertions(+), 41 deletions(-) create mode 100644 per/management/commands/create_dummy_opslearningsummary.py diff --git a/per/factories.py b/per/factories.py index 049ce0ed6..ec418ef2e 100644 --- a/per/factories.py +++ b/per/factories.py @@ -3,6 +3,7 @@ import factory from factory import fuzzy +from deployments.factories.project import SectorTagFactory from per.models import ( AssessmentType, Form, @@ -12,6 +13,10 @@ FormData, FormPrioritization, FormQuestion, + OpsLearning, + OpsLearningCacheResponse, + OpsLearningComponentCacheResponse, + OpsLearningSectorCacheResponse, Overview, PerWorkPlan, PerWorkPlanComponent, @@ -59,6 +64,7 @@ class Meta: class FormComponentFactory(factory.django.DjangoModelFactory): area = factory.SubFactory(FormAreaFactory) + title = fuzzy.FuzzyText(length=50, prefix="component-") class Meta: model = FormComponent @@ -97,3 +103,38 @@ class FormPrioritizationFactory(factory.django.DjangoModelFactory): class Meta: model = FormPrioritization + + +class OpsLearningFactory(factory.django.DjangoModelFactory): + learning = fuzzy.FuzzyText(length=50) + + class Meta: + model = OpsLearning + + +class OpsLearningCacheResponseFactory(factory.django.DjangoModelFactory): + used_filters_hash = fuzzy.FuzzyText(length=20) + insights_1 = fuzzy.FuzzyText(length=50, prefix="insight-") + insights_2 = fuzzy.FuzzyText(length=50, prefix="insight-") + insights_3 = fuzzy.FuzzyText(length=50, prefix="insight-") + + class Meta: + model = OpsLearningCacheResponse + + +class OpsLearningSectorCacheResponseFactory(factory.django.DjangoModelFactory): + filter_response = factory.SubFactory(OpsLearningCacheResponseFactory) + summary = fuzzy.FuzzyText(length=50) + sector = factory.SubFactory(SectorTagFactory) + + class Meta: + model = OpsLearningSectorCacheResponse + + +class OpsLearningComponentCacheResponseFactory(factory.django.DjangoModelFactory): + filter_response = factory.SubFactory(OpsLearningCacheResponseFactory) + summary = fuzzy.FuzzyText(length=50) + component = factory.SubFactory(FormComponentFactory) + + class Meta: + model = OpsLearningComponentCacheResponse diff --git a/per/management/commands/create_dummy_opslearningsummary.py b/per/management/commands/create_dummy_opslearningsummary.py new file mode 100644 index 000000000..192f2d007 --- /dev/null +++ b/per/management/commands/create_dummy_opslearningsummary.py @@ -0,0 +1,64 @@ +from django.core.management.base import BaseCommand +from django.conf import settings +from django.db import transaction + +from per.factories import ( + OpsLearningCacheResponseFactory, + OpsLearningComponentCacheResponseFactory, + OpsLearningFactory, + OpsLearningSectorCacheResponseFactory, +) + + +class Command(BaseCommand): + help = "Create dummy OpsLearningSummary" + + def generate_sector_response(self, ops_learnings: list, ops_learning_cache_response): + """ + Generate dummy OpsLearningSectorCacheResponse + """ + dummy_ops_learning_sector_cache_response = OpsLearningSectorCacheResponseFactory.create_batch( + 5, + filter_response=ops_learning_cache_response + ) + for ops_learning_sector_cache in dummy_ops_learning_sector_cache_response: + ops_learning_sector_cache.used_ops_learning.add( + *ops_learnings + ) + + def generate_component_response(self, ops_learnings: list, ops_learning_cache_response: list): + """ + Generate dummy OpsLearningComponentCacheResponse + """ + dummy_ops_learning_component_cache_response = OpsLearningComponentCacheResponseFactory.create_batch( + 5, + filter_response=ops_learning_cache_response + ) + for ops_learning_component_cache in dummy_ops_learning_component_cache_response: + ops_learning_component_cache.used_ops_learning.add( + *ops_learnings + ) + + def generate_ops_learning_summary(self): + selected_ops_learning = OpsLearningFactory.create_batch(50, is_validated=True) + + # Generating dummy OpsLearningCacheResponse + dummy_ops_learning_cache_responses = OpsLearningCacheResponseFactory.create_batch(5) + for ops_learning_cache in dummy_ops_learning_cache_responses: + ops_learning_cache.used_ops_learning.add( + *selected_ops_learning[:10] + ) + self.generate_sector_response(selected_ops_learning[11:20], ops_learning_cache) + self.generate_component_response(selected_ops_learning[21:50], ops_learning_cache) + + self.stdout.write(self.style.SUCCESS('Successfully created dummy OpsLearningSummary')) + + @transaction.atomic + def handle(self, *args, **options): + if not settings.DEBUG and not settings.GO_ENVIRONMENT == 'development': + self.stderr.write( + 'Dummy data generation is not allowed for this instance.' + ' Use environment variable DEBUG set to True and GO_ENVIRONMENT to development' + ) + return + self.generate_ops_learning_summary() diff --git a/per/migrations/0121_opslearningcacheresponse_and_more.py b/per/migrations/0121_opslearningcacheresponse_and_more.py index c27c90f31..c1f39b1cc 100644 --- a/per/migrations/0121_opslearningcacheresponse_and_more.py +++ b/per/migrations/0121_opslearningcacheresponse_and_more.py @@ -1,55 +1,87 @@ -# Generated by Django 4.2.13 on 2024-07-05 08:42 +# Generated by Django 4.2.13 on 2024-07-09 09:35 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0089_alter_emergencyproject_districts'), - ('per', '0120_alter_formcomponent_status'), + ("deployments", "0089_alter_emergencyproject_districts"), + ("per", "0120_alter_formcomponent_status"), ] operations = [ migrations.CreateModel( - name='OpsLearningCacheResponse', + name="OpsLearningCacheResponse", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('used_filters_hash', models.CharField(max_length=32, verbose_name='used filters hash')), - ('used_filters', models.JSONField(default=dict, verbose_name='used filters')), - ('used_prompt_hash', models.CharField(max_length=32, verbose_name='used prompt hash')), - ('used_prompt', models.TextField(blank=True, null=True, verbose_name='used prompt')), - ('insights_1', models.TextField(blank=True, null=True, verbose_name='insights 1')), - ('insights_2', models.TextField(blank=True, null=True, verbose_name='insights 2')), - ('insights_3', models.TextField(blank=True, null=True, verbose_name='insights 3')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified_at')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('used_ops_learning', models.ManyToManyField(related_name='+', to='per.opslearning')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("used_filters_hash", models.CharField(max_length=32, verbose_name="used filters hash")), + ("used_filters", models.JSONField(default=dict, verbose_name="used filters")), + ("used_prompt_hash", models.CharField(max_length=32, verbose_name="used prompt hash")), + ("used_prompt", models.TextField(blank=True, null=True, verbose_name="used prompt")), + ("insights_1", models.TextField(blank=True, null=True, verbose_name="insights 1")), + ("insights_2", models.TextField(blank=True, null=True, verbose_name="insights 2")), + ("insights_3", models.TextField(blank=True, null=True, verbose_name="insights 3")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="modified_at")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("used_ops_learning", models.ManyToManyField(related_name="+", to="per.opslearning")), ], ), migrations.CreateModel( - name='OpsLearningSectorCacheResponse', + name="OpsLearningSectorCacheResponse", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('summary', models.TextField(verbose_name='summary')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified_at')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('filter_response', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='per.opslearningcacheresponse', verbose_name='filter response')), - ('sector', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='deployments.sectortag', verbose_name='sector')), - ('used_ops_learning', models.ManyToManyField(related_name='+', to='per.opslearning')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("summary", models.TextField(verbose_name="summary")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="modified_at")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ( + "filter_response", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="ops_learning_sector", + to="per.opslearningcacheresponse", + verbose_name="filter response", + ), + ), + ( + "sector", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to="deployments.sectortag", + verbose_name="sector", + ), + ), + ("used_ops_learning", models.ManyToManyField(related_name="+", to="per.opslearning")), ], ), migrations.CreateModel( - name='OpsLearningComponentCacheResponse', + name="OpsLearningComponentCacheResponse", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('summary', models.TextField(verbose_name='summary')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified_at')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('component', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='per.formcomponent', verbose_name='component')), - ('filter_response', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='per.opslearningcacheresponse', verbose_name='filter response')), - ('used_ops_learning', models.ManyToManyField(related_name='+', to='per.opslearning')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("summary", models.TextField(verbose_name="summary")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="modified_at")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ( + "component", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to="per.formcomponent", + verbose_name="component", + ), + ), + ( + "filter_response", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="ops_learning_component", + to="per.opslearningcacheresponse", + verbose_name="filter response", + ), + ), + ("used_ops_learning", models.ManyToManyField(related_name="+", to="per.opslearning")), ], ), ] diff --git a/per/models.py b/per/models.py index 5015bd333..21c10663b 100644 --- a/per/models.py +++ b/per/models.py @@ -772,7 +772,7 @@ class OpsLearningCacheResponse(models.Model): created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) def __str__(self) -> str: - return self.filter_hash + return self.used_filters_hash class OpsLearningSectorCacheResponse(models.Model): @@ -780,7 +780,7 @@ class OpsLearningSectorCacheResponse(models.Model): OpsLearningCacheResponse, verbose_name=_("filter response"), on_delete=models.CASCADE, - related_name="+", + related_name="ops_learning_sector", ) sector = models.ForeignKey( SectorTag, @@ -805,7 +805,7 @@ class OpsLearningComponentCacheResponse(models.Model): OpsLearningCacheResponse, verbose_name=_("filter response"), on_delete=models.CASCADE, - related_name="+", + related_name="ops_learning_component", ) component = models.ForeignKey( FormComponent, diff --git a/per/serializers.py b/per/serializers.py index c3274cb7c..bbba4b64c 100644 --- a/per/serializers.py +++ b/per/serializers.py @@ -1136,20 +1136,24 @@ class Meta: class OpsLearningSectorCacheResponseSerializer(serializers.ModelSerializer): + title = serializers.CharField(source="sector.title", read_only=True) + class Meta: model = OpsLearningSectorCacheResponse - fields = ["summary"] + fields = ["summary", "title"] class OpsLearningComponentCacheResponseSerializer(serializers.ModelSerializer): + title = serializers.CharField(source="component.title", read_only=True) + class Meta: model = OpsLearningComponentCacheResponse - fields = ["summary"] + fields = ["summary", "title",] class OpsLearningSummarySerializer(serializers.ModelSerializer): - by_sectors = OpsLearningSectorCacheResponseSerializer(many=True) - by_components = OpsLearningComponentCacheResponseSerializer(many=True) + sectors = OpsLearningSectorCacheResponseSerializer(source="ops_learning_sector", many=True) + components = OpsLearningComponentCacheResponseSerializer(source="ops_learning_component", many=True) class Meta: model = OpsLearningCacheResponse @@ -1158,6 +1162,6 @@ class Meta: "insights_1", "insights_2", "insights_3", - "by_sectors", - "by_components", + "sectors", + "components", ]