summaryrefslogtreecommitdiff
path: root/patchwork/api/comment.py
blob: 43b26c6138a6f6a1fc40b1cbbcd03cfa92229690 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# Patchwork - automated patch tracking system
# Copyright (C) 2018 Red Hat
#
# SPDX-License-Identifier: GPL-2.0-or-later

import email.parser

from django.http import Http404
from rest_framework.generics import ListAPIView
from rest_framework.serializers import SerializerMethodField

from patchwork.api.base import BaseHyperlinkedModelSerializer
from patchwork.api.base import PatchworkPermission
from patchwork.api.embedded import PersonSerializer
from patchwork.models import Cover
from patchwork.models import CoverComment
from patchwork.models import Patch
from patchwork.models import PatchComment


class BaseCommentListSerializer(BaseHyperlinkedModelSerializer):

    web_url = SerializerMethodField()
    subject = SerializerMethodField()
    headers = SerializerMethodField()
    submitter = PersonSerializer(read_only=True)

    def get_web_url(self, instance):
        request = self.context.get('request')
        return request.build_absolute_uri(instance.get_absolute_url())

    def get_subject(self, comment):
        return email.parser.Parser().parsestr(comment.headers,
                                              True).get('Subject', '')

    def get_headers(self, comment):
        headers = {}

        if comment.headers:
            parsed = email.parser.Parser().parsestr(comment.headers, True)
            for key in parsed.keys():
                headers[key] = parsed.get_all(key)
                # Let's return a single string instead of a list if only one
                # header with this key is present
                if len(headers[key]) == 1:
                    headers[key] = headers[key][0]

        return headers

    class Meta:
        fields = ('id', 'web_url', 'msgid', 'list_archive_url', 'date',
                  'subject', 'submitter', 'content', 'headers')
        read_only_fields = fields
        versioned_fields = {
            '1.1': ('web_url', ),
            '1.2': ('list_archive_url',),
        }


class CoverCommentListSerializer(BaseCommentListSerializer):

    class Meta:
        model = CoverComment
        fields = BaseCommentListSerializer.Meta.fields
        read_only_fields = fields
        versioned_fields = BaseCommentListSerializer.Meta.versioned_fields


class PatchCommentListSerializer(BaseCommentListSerializer):

    class Meta:
        model = PatchComment
        fields = BaseCommentListSerializer.Meta.fields
        read_only_fields = fields
        versioned_fields = BaseCommentListSerializer.Meta.versioned_fields


class CoverCommentList(ListAPIView):
    """List cover comments"""

    permission_classes = (PatchworkPermission,)
    serializer_class = CoverCommentListSerializer
    search_fields = ('subject',)
    ordering_fields = ('id', 'subject', 'date', 'submitter')
    ordering = 'id'
    lookup_url_kwarg = 'pk'

    def get_queryset(self):
        if not Cover.objects.filter(pk=self.kwargs['pk']).exists():
            raise Http404

        return CoverComment.objects.filter(
            cover=self.kwargs['pk']
        ).select_related('submitter')


class PatchCommentList(ListAPIView):
    """List comments"""

    permission_classes = (PatchworkPermission,)
    serializer_class = PatchCommentListSerializer
    search_fields = ('subject',)
    ordering_fields = ('id', 'subject', 'date', 'submitter')
    ordering = 'id'
    lookup_url_kwarg = 'pk'

    def get_queryset(self):
        if not Patch.objects.filter(pk=self.kwargs['pk']).exists():
            raise Http404

        return PatchComment.objects.filter(
            patch=self.kwargs['pk']
        ).select_related('submitter')