DRF getstream空通知

时间:2019-06-11 04:05:52

标签: django-rest-framework getstream-io

我试图在getstream上获得Django Rest Framework的概念证明,以增强inapp通知。

我的代码https://github.com/morenoh149/django-rest-framework-getstream

models.py

class Snippet(models.Model, Activity):
    created_at = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(
        choices=LANGUAGE_CHOICES, default='python', max_length=100)
    style = models.CharField(
        choices=STYLE_CHOICES, default='friendly', max_length=100)
    owner = models.ForeignKey(
        'auth.User', related_name='snippets', on_delete=models.CASCADE)
    highlighted = models.TextField()

    @property
    def activity_actor_attr(self):
        return self.owner

    @property
    def activity_notify(self):
        return [feed_manager.get_notification_feed(self.owner_id)]

    class Meta:
        ordering = ('created_at', )

    def save(self, *args, **kwargs):
        """
        Use the `pygments` library to create a highlighted HTML
        representation of the code snippet.
        """
        lexer = get_lexer_by_name(self.language)
        linenos = self.linenos and 'table' or False
        options = self.title and {'title': self.title} or {}
        formatter = HtmlFormatter(
            style=self.style, linenos=linenos, full=True, **options)
        self.highlighted = highlight(self.code, lexer, formatter)
        super(Snippet, self).save(*args, **kwargs)

serializers.py

from django.contrib.auth.models import User from rest_framework import serializers

from snippets.models import Snippet


class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    highlight = serializers.HyperlinkedIdentityField(
        view_name='snippet-highlight', format='html')

    class Meta:
        model = Snippet
        fields = ('url', 'id', 'highlight', 'owner', 'title', 'code',
                  'linenos', 'language', 'style')

class ActivitySerializer(serializers.Serializer):
    id = serializers.UUIDField()
    foreign_id = serializers.CharField()
    verb = serializers.CharField()
    time = serializers.DateTimeField()

    def __init__(self, *args, **kwargs):
        object_serializer = kwargs.pop("object_serializer", None)
        actor_serializer = kwargs.pop("actor_serializer", None)
        super().__init__(self, *args, **kwargs)
        if object_serializer:
            self.fields["object"] = object_serializer()
        else:
            self.fields["object"] = serializers.CharField()
        if actor_serializer:
            self.fields["actor"] = actor_serializer()
        else:
            self.fields["actor"] = serializers.CharField()


class AggregatedSerializer(ActivitySerializer):
    group = serializers.CharField()
    activities = ActivitySerializer(many=True)


class NotificationSerializer(AggregatedSerializer):
    is_seen = serializers.BooleanField()
    is_read = serializers.BooleanField()


def get_activity_serializer(data, object_serializer=None, actor_serializer=None, **kwargs):
    kwargs["object_serializer"] = object_serializer
    kwargs["actor_serializer"] = actor_serializer
    serializer = ActivitySerializer
    if "is_seen" in data:
        serializer = NotificationSerializer
    elif "activities" in data:
        serializer = AggregatedSerializer
    return serializer(data, **kwargs)

views.py

class NotificationViewSet(viewsets.ViewSet):
    """
    This viewset returns a notifications feed for the logged in user.
    The feed contains events for when a relevant snippet is created.
    """
    serializer_class = NotificationSerializer

    def list(self, request):
        feeds = feed_manager.get_news_feeds(self.request.user.id)
        activities = feeds.get('timeline_aggregated').get()['results']
        enriched_activities = enricher.enrich_aggregated_activities(activities)
        serializer = get_activity_serializer(enriched_activities, SnippetSerializer, None, many=True)
        return Response(serializer.data)

如何获取/notifications/端点以返回已登录用户的通知?

0 个答案:

没有答案