From b000d3c1483021bb12112705072a81d5443d84cd Mon Sep 17 00:00:00 2001 From: Alexey Kudelko Date: Tue, 5 Mar 2024 14:00:20 +0300 Subject: [PATCH 1/5] fixed bug. also slightly optimized other signal --- feed/signals.py | 13 +++++++++++-- projects/models.py | 13 +------------ projects/signals.py | 4 +--- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/feed/signals.py b/feed/signals.py index 895facf4..bd7b9e34 100644 --- a/feed/signals.py +++ b/feed/signals.py @@ -3,7 +3,7 @@ from django.dispatch import receiver from news.models import News - +from projects.models import Project from vacancy.models import Vacancy @@ -11,7 +11,16 @@ @receiver(post_save, sender=Vacancy) def create_news_on_save(sender, instance, created, **kwargs): if created: - content_type = ContentType.objects.filter(model="vacancy").first() + content_type = ContentType.objects.get_for_model(Vacancy) + news_instance, created = News.objects.get_or_create( + content_type=content_type, object_id=instance.id + ) + + +@receiver(post_save, sender=Project) +def create_news_on_created_project(sender, instance, created, **kwargs): + if not instance.draft: + content_type = ContentType.objects.get_for_model(Project) news_instance, created = News.objects.get_or_create( content_type=content_type, object_id=instance.id ) diff --git a/projects/models.py b/projects/models.py index 169ba6af..c105b68f 100644 --- a/projects/models.py +++ b/projects/models.py @@ -2,14 +2,13 @@ from django.contrib.auth import get_user_model from django.contrib.contenttypes.fields import GenericRelation -from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import UniqueConstraint from core.models import Like, View from files.models import UserFile from industries.models import Industry -from news.models import News + from projects.constants import VERBOSE_STEPS from projects.managers import AchievementManager, CollaboratorManager, ProjectManager from users.models import CustomUser @@ -135,16 +134,6 @@ def get_collaborators_user_list(self) -> list[User]: def __str__(self): return f"Project<{self.id}> - {self.name}" - def save( - self, force_insert=False, force_update=False, using=None, update_fields=None - ): - if not self.draft: - content_type = ContentType.objects.filter(model="project").first() - news_instance, created = News.objects.get_or_create( - content_type=content_type, object_id=self.id - ) - super().save(force_insert, force_update, using, update_fields) - class Meta: ordering = ["-hidden_score", "-datetime_created"] verbose_name = "Проект" diff --git a/projects/signals.py b/projects/signals.py index 5682c296..51bec65a 100644 --- a/projects/signals.py +++ b/projects/signals.py @@ -12,9 +12,7 @@ def create_project(sender, instance, created, **kwargs): """ if not instance.draft: - # if not a draft, check if project chat exists and if not create it - if not ProjectChat.objects.filter(project=instance).exists(): - ProjectChat.objects.create(project=instance) + chat_instance, chat_created = ProjectChat.objects.get_or_create(project=instance) if created: Collaborator.objects.create( From 3004c56d3e5f497a13bcc6a672311dcbde87f3f9 Mon Sep 17 00:00:00 2001 From: Alexey Kudelko Date: Tue, 5 Mar 2024 15:33:05 +0300 Subject: [PATCH 2/5] refactored signals code --- feed/constants.py | 4 ++++ feed/services.py | 18 ++++++++++++++++++ feed/signals.py | 31 +++++++++++++++++++------------ feed/views.py | 1 + 4 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 feed/constants.py create mode 100644 feed/services.py diff --git a/feed/constants.py b/feed/constants.py new file mode 100644 index 00000000..4b700a29 --- /dev/null +++ b/feed/constants.py @@ -0,0 +1,4 @@ +from projects.models import Project +from vacancy.models import Vacancy + +SIGNALS_MODELS = Vacancy | Project diff --git a/feed/services.py b/feed/services.py new file mode 100644 index 00000000..bb758d26 --- /dev/null +++ b/feed/services.py @@ -0,0 +1,18 @@ +from django.contrib.contenttypes.models import ContentType + +from feed.constants import SIGNALS_MODELS +from news.models import News + + +def delete_news_for_model(instance: SIGNALS_MODELS): + content_type = ContentType.objects.get_for_model(instance) + obj = News.objects.filter(content_type=content_type, object_id=instance.id).first() + if obj: + obj.delete() + + +def create_news_for_model(instance: SIGNALS_MODELS): + content_type = ContentType.objects.get_for_model(instance) + news_instance, created = News.objects.get_or_create( + content_type=content_type, object_id=instance.id + ) diff --git a/feed/signals.py b/feed/signals.py index bd7b9e34..546409c1 100644 --- a/feed/signals.py +++ b/feed/signals.py @@ -1,8 +1,7 @@ -from django.contrib.contenttypes.models import ContentType -from django.db.models.signals import post_save +from django.db.models.signals import post_save, post_delete from django.dispatch import receiver -from news.models import News +from feed.services import create_news_for_model, delete_news_for_model from projects.models import Project from vacancy.models import Vacancy @@ -10,17 +9,25 @@ @receiver(post_save, sender=Vacancy) def create_news_on_save(sender, instance, created, **kwargs): - if created: - content_type = ContentType.objects.get_for_model(Vacancy) - news_instance, created = News.objects.get_or_create( - content_type=content_type, object_id=instance.id - ) + if instance.is_active: + create_news_for_model(instance) + else: + delete_news_for_model(instance) + + +@receiver(post_delete, sender=Vacancy) +def delete_news_vacancy(sender, instance, **kwargs): + delete_news_for_model(instance) @receiver(post_save, sender=Project) def create_news_on_created_project(sender, instance, created, **kwargs): if not instance.draft: - content_type = ContentType.objects.get_for_model(Project) - news_instance, created = News.objects.get_or_create( - content_type=content_type, object_id=instance.id - ) + create_news_for_model(instance) + else: + delete_news_for_model(instance) + + +@receiver(post_delete, sender=Project) +def delete_news_project(sender, instance, **kwargs): + delete_news_for_model(instance) diff --git a/feed/views.py b/feed/views.py index 6ce9a8a7..0480683d 100644 --- a/feed/views.py +++ b/feed/views.py @@ -80,4 +80,5 @@ def create(self, request): object_id=vacancy.id, datetime_created=vacancy.datetime_created, ) + return Response({"status": "success"}, status=201) From 83f14c10ef2fae2ac042d00874c4dbe495ae5564 Mon Sep 17 00:00:00 2001 From: Alexey Kudelko Date: Wed, 6 Mar 2024 01:26:51 +0300 Subject: [PATCH 3/5] devscript added new --- feed/views.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/feed/views.py b/feed/views.py index 0480683d..ec1127ef 100644 --- a/feed/views.py +++ b/feed/views.py @@ -59,26 +59,36 @@ def get(self, *args, **kwargs): class DevScript(CreateAPIView): def create(self, request): - content_type = ContentType.objects.filter(model="project").first() + content_type_project = ContentType.objects.filter(model="project").first() for project in Project.objects.filter(draft=False): if not News.objects.filter( - content_type=content_type, object_id=project.id + content_type=content_type_project, object_id=project.id ).exists(): News.objects.create( - content_type=content_type, + content_type=content_type_project, object_id=project.id, datetime_created=project.datetime_created, ) - content_type = ContentType.objects.filter(model="vacancy").first() + content_type_vacancy = ContentType.objects.filter(model="vacancy").first() for vacancy in Vacancy.objects.filter(is_active=True): if not News.objects.filter( - content_type=content_type, object_id=vacancy.id + content_type=content_type_vacancy, object_id=vacancy.id ).exists(): News.objects.create( - content_type=content_type, + content_type=content_type_vacancy, object_id=vacancy.id, datetime_created=vacancy.datetime_created, ) + news_to_delete = list( + News.objects.filter( + content_type__in=[content_type_vacancy, content_type_project] + ) + ) + + for news in news_to_delete: + if not news.content_object: + news.delete() + return Response({"status": "success"}, status=201) From 321242cfdebfcf87789aff945d191a5c16005e54 Mon Sep 17 00:00:00 2001 From: Alexey Kudelko Date: Mon, 11 Mar 2024 11:50:53 +0300 Subject: [PATCH 4/5] corrected projects/signals, deleted useless variables --- projects/signals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/signals.py b/projects/signals.py index 51bec65a..59ea5d3b 100644 --- a/projects/signals.py +++ b/projects/signals.py @@ -12,7 +12,7 @@ def create_project(sender, instance, created, **kwargs): """ if not instance.draft: - chat_instance, chat_created = ProjectChat.objects.get_or_create(project=instance) + ProjectChat.objects.get_or_create(project=instance) if created: Collaborator.objects.create( From c2d64bd2f833dc6bd4ec1a2aa23802bfb2168690 Mon Sep 17 00:00:00 2001 From: Alexey Kudelko Date: Mon, 11 Mar 2024 11:52:38 +0300 Subject: [PATCH 5/5] deleted useless variables x2 --- feed/services.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/feed/services.py b/feed/services.py index bb758d26..f63d95ca 100644 --- a/feed/services.py +++ b/feed/services.py @@ -13,6 +13,4 @@ def delete_news_for_model(instance: SIGNALS_MODELS): def create_news_for_model(instance: SIGNALS_MODELS): content_type = ContentType.objects.get_for_model(instance) - news_instance, created = News.objects.get_or_create( - content_type=content_type, object_id=instance.id - ) + News.objects.get_or_create(content_type=content_type, object_id=instance.id)