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
17 changes: 17 additions & 0 deletions projects/migrations/0017_remove_project_views_count.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.1.3 on 2023-06-20 20:46

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("projects", "0016_alter_projectnews_files"),
]

operations = [
migrations.RemoveField(
model_name="project",
name="views_count",
),
]
6 changes: 0 additions & 6 deletions projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,6 @@ class Project(models.Model):

objects = ProjectManager()

views_count = models.PositiveIntegerField(default=0)

def increment_views_count(self):
self.views_count += 1
self.save()

def get_short_description(self) -> Optional[str]:
return self.description[:90] if self.description else None

Expand Down
22 changes: 19 additions & 3 deletions projects/serializers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers

from core.fields import CustomListField
from core.models import View
from core.services import get_views_count, get_likes_count, is_fan
from industries.models import Industry
from projects.models import Project, Achievement, Collaborator, ProjectNews
Expand Down Expand Up @@ -71,6 +73,7 @@ class ProjectDetailSerializer(serializers.ModelSerializer):
short_description = serializers.SerializerMethodField()
industry_id = serializers.IntegerField(required=False)
likes_count = serializers.SerializerMethodField(method_name="count_likes")
views_count = serializers.SerializerMethodField(method_name="count_views")
links = serializers.SerializerMethodField()

@classmethod
Expand All @@ -88,6 +91,13 @@ def get_short_description(cls, project):
def count_likes(self, project):
return LikesOnProject.objects.filter(project=project, is_liked=True).count()

def count_views(self, project):
# FIXME
# TODO: add caching here at least every 5 minutes, otherwise will be heavy load
return View.objects.filter(
content_type=ContentType.objects.get_for_model(Project), object_id=project.pk
).count()

def update(self, instance, validated_data):
instance = super().update(instance, validated_data)
instance.save()
Expand Down Expand Up @@ -132,6 +142,14 @@ class ProjectListSerializer(serializers.ModelSerializer):
method_name="get_collaborator_count"
)
vacancies = ProjectVacancyListSerializer(many=True, read_only=True)
views_count = serializers.SerializerMethodField(method_name="count_views")

def count_views(self, project):
# FIXME
# TODO: add caching here at least every 5 minutes, otherwise will be heavy load
return View.objects.filter(
content_type=ContentType.objects.get_for_model(Project), object_id=project.pk
).count()

short_description = serializers.SerializerMethodField()

Expand Down Expand Up @@ -172,9 +190,7 @@ class Meta:
"views_count",
]

read_only_fields = [
"leader",
]
read_only_fields = ["leader", "views_count"]

def is_valid(self, *, raise_exception=False):
return super().is_valid(raise_exception=raise_exception)
Expand Down
6 changes: 5 additions & 1 deletion projects/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from rest_framework.response import Response
from rest_framework.views import APIView

from core.models import View
from core.permissions import IsStaffOrReadOnly
from core.serializers import SetLikedSerializer
from core.services import add_view, set_like
Expand Down Expand Up @@ -92,7 +93,10 @@ class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):

def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
instance.increment_views_count()
# create (or not, if it exists) a view object for project
View.objects.get_or_create(
user=request.user, content_type=Project, content_object=instance
)
serializer = self.get_serializer(instance)
return Response(serializer.data)

Expand Down