Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions feed/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from projects.models import Project
from vacancy.models import Vacancy

SIGNALS_MODELS = Vacancy | Project
16 changes: 16 additions & 0 deletions feed/services.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
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.objects.get_or_create(content_type=content_type, object_id=instance.id)
34 changes: 25 additions & 9 deletions feed/signals.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,33 @@
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


@receiver(post_save, sender=Vacancy)
def create_news_on_save(sender, instance, created, **kwargs):
if created:
content_type = ContentType.objects.filter(model="vacancy").first()
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:
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)
23 changes: 17 additions & 6 deletions feed/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +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)
13 changes: 1 addition & 12 deletions projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 = "Проект"
Expand Down
4 changes: 1 addition & 3 deletions projects/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
ProjectChat.objects.get_or_create(project=instance)

if created:
Collaborator.objects.create(
Expand Down