Skip to content

Commit

Permalink
Merge branch 'master' into implement-lending-system
Browse files Browse the repository at this point in the history
  • Loading branch information
jonasdeluna committed May 24, 2024
2 parents 1c86b53 + 99fb7e5 commit 3cf0058
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 2 deletions.
28 changes: 27 additions & 1 deletion lego/apps/comments/models.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models

from lego.apps.comments.permissions import CommentPermissionHandler
from lego.apps.content.fields import ContentField
from lego.apps.reactions.models import Reaction
from lego.utils.managers import BasisModelManager
from lego.utils.models import BasisModel

Expand All @@ -19,6 +20,7 @@ class Comment(BasisModel):
object_id = models.PositiveIntegerField(db_index=True)
content_object = GenericForeignKey()
parent = models.ForeignKey("self", null=True, blank=True, on_delete=models.CASCADE)
reactions = GenericRelation(Reaction)

objects = CommentManager() # type: ignore

Expand All @@ -34,5 +36,29 @@ def delete(self):
else:
super(Comment, self).delete(force=True)

def get_reactions_grouped(self, user):
grouped = {}
for reaction in self.reactions.all():
if reaction.emoji.pk not in grouped:
grouped[reaction.emoji.pk] = {
"emoji": reaction.emoji.pk,
"unicode_string": reaction.emoji.unicode_string,
"count": 0,
"has_reacted": False,
"reaction_id": None,
}

grouped[reaction.emoji.pk]["count"] += 1

if reaction.created_by == user:
grouped[reaction.emoji.pk]["has_reacted"] = True
grouped[reaction.emoji.pk]["reaction_id"] = reaction.id

return sorted(grouped.values(), key=lambda kv: kv["count"], reverse=True)

def __str__(self):
return self.text

@property
def content_target_self(self):
return f"{self._meta.app_label}.{self._meta.model_name}-{self.pk}"
11 changes: 10 additions & 1 deletion lego/apps/comments/serializers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework.fields import DateTimeField
from rest_framework.fields import CharField, DateTimeField

from lego.apps.comments.models import Comment
from lego.apps.content.fields import ContentSerializerField
Expand All @@ -14,6 +15,8 @@ class CommentSerializer(BasisModelSerializer):
updated_at = DateTimeField(read_only=True)
content_target = GenericRelationField(source="content_object")
text = ContentSerializerField()
reactions_grouped = serializers.SerializerMethodField()
content_target_self = CharField(read_only=True)

class Meta:
model = Comment
Expand All @@ -22,11 +25,17 @@ class Meta:
"text",
"author",
"content_target",
"content_target_self",
"created_at",
"updated_at",
"parent",
"reactions_grouped",
)

def get_reactions_grouped(self, obj):
user = self.context["request"].user
return obj.get_reactions_grouped(user)

def validate(self, attrs):
content_target = attrs.get("content_object")

Expand Down
56 changes: 56 additions & 0 deletions lego/apps/comments/tests/test_reactions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from lego.apps.articles.models import Article
from lego.apps.comments.models import Comment
from lego.apps.emojis.models import Emoji
from lego.apps.reactions.models import Reaction
from lego.apps.users.models import User
from lego.utils.test_utils import BaseTestCase


class CommentReactionsTestCase(BaseTestCase):
fixtures = [
"test_abakus_groups.yaml",
"test_users.yaml",
"test_emojis.yaml",
"test_articles.yaml",
]

def setUp(self):
self.comment = Comment.objects.create(
created_by_id=0,
text="first comment",
content_object=Article.objects.all().first(),
)
self.user = User.objects.all().first()
self.comment.created_by = self.user
self.comment.save()

self.emoji = Emoji.objects.first()

def test_add_reaction(self):
test_reaction = Reaction.objects.create(
content_object=self.comment, emoji=self.emoji
)
test_reaction.created_by = self.user
test_reaction.save()

reactions_grouped = self.comment.get_reactions_grouped(self.user)
self.assertEqual(len(reactions_grouped), 1)
self.assertEqual(reactions_grouped[0]["count"], 1)
self.assertEqual(reactions_grouped[0]["has_reacted"], True)
self.assertEqual(
reactions_grouped[0]["unicode_string"], self.emoji.unicode_string
)

def test_remove_reaction(self):
test_reaction = Reaction.objects.create(
content_object=self.comment, emoji=self.emoji
)

reactions_grouped = self.comment.get_reactions_grouped(self.user)
self.assertEqual(len(reactions_grouped), 1)
self.assertEqual(reactions_grouped[0]["count"], 1)

test_reaction.delete()

reactions_grouped = self.comment.get_reactions_grouped(self.user)
self.assertEqual(len(reactions_grouped), 0)
6 changes: 6 additions & 0 deletions lego/apps/stats/analytics_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ def setup_analytics():
write_key = getattr(settings, "ANALYTICS_WRITE_KEY", "")
host = getattr(settings, "ANALYTICS_HOST", "https://api.segment.io")

if write_key == "":
return

production = getattr(settings, "ENVIRONMENT_NAME", None) == "production"
send = not (development or getattr(settings, "TESTING", False)) or production

Expand All @@ -36,6 +39,9 @@ def setup_analytics():
def _proxy(method, user, *args, **kwargs):
global default_client, development

if default_client is None:
return

fn = getattr(default_client, method)

kwargs["context"] = {
Expand Down

0 comments on commit 3cf0058

Please sign in to comment.