[PATCHv2 05/10] REST: Add Patches to the API
Finucane, Stephen
stephen.finucane at intel.com
Tue May 17 23:25:51 AEST 2016
On 17 May 14:08, Finucane, Stephen wrote:
> On 10 May 17:39, Andy Doan wrote:
> > This exports patches via the REST API.
>
> supernit: s/exports/exposes :)
>
> > Security Constraints:
> > * Anyone (logged in or not) can read all objects.
> > * No one can create/delete objects.
> > * Project maintainers are allowed to update (ie "patch"
> > attributes)
> >
> > NOTE: Patch.save was overridden incorrectly and had to be
> > fixed to work with DRF.
>
> On further inspection, I think the responses still need a little work.
> Sorry for not spotting this the first go round.
>
> Stephen
>
> > Signed-off-by: Andy Doan <andy.doan at linaro.org>
> > ---
> > patchwork/models.py | 4 +-
> > patchwork/rest_serializers.py | 9 +++-
> > patchwork/tests/test_rest_api.py | 110 ++++++++++++++++++++++++++++++++++++++-
> > patchwork/views/rest_api.py | 9 +++-
> > 4 files changed, 126 insertions(+), 6 deletions(-)
> >
> > diff --git a/patchwork/models.py b/patchwork/models.py
> > index 4d454c7..6324273 100644
> > --- a/patchwork/models.py
> > +++ b/patchwork/models.py
> > @@ -359,14 +359,14 @@ class Patch(Submission):
> > for tag in tags:
> > self._set_tag(tag, counter[tag])
> >
> > - def save(self):
> > + def save(self, **kwargs):
> > if not hasattr(self, 'state') or not self.state:
> > self.state = get_default_initial_patch_state()
> >
> > if self.hash is None and self.diff is not None:
> > self.hash = hash_patch(self.diff).hexdigest()
> >
> > - super(Patch, self).save()
> > + super(Patch, self).save(**kwargs)
> >
> > self.refresh_tag_counts()
> >
> > diff --git a/patchwork/rest_serializers.py b/patchwork/rest_serializers.py
> > index 60633b4..52a0306 100644
> > --- a/patchwork/rest_serializers.py
> > +++ b/patchwork/rest_serializers.py
> > @@ -17,7 +17,7 @@
> > # along with Patchwork; if not, write to the Free Software
> > # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> >
> > -from patchwork.models import Person, Project
> > +from patchwork.models import Patch, Person, Project
> >
> > from rest_framework.serializers import ModelSerializer
> >
> > @@ -30,3 +30,10 @@ class PersonSerializer(ModelSerializer):
> > class ProjectSerializer(ModelSerializer):
> > class Meta:
> > model = Project
> > +
> > +
> > +class PatchSerializer(ModelSerializer):
> > + class Meta:
> > + model = Patch
> > + read_only_fields = ('project', 'name', 'date', 'submitter', 'diff',
> > + 'content', 'hash', 'msgid')
>
> So I played around with think the responses could do with a little more
> work. Firstly, here's a sample response (with the really long fields
> "SNIPPED!").
>
> {
> "id": 1,
> "mbox_url": "/patch/1/mbox/",
> "msgid": "<1391726961-32072-1-git-send-email-markus.mayer at linaro.org>",
> "date": "2014-02-06T22:49:21",
> "headers": "SNIPPED!",
> "content": "SNIPPED!",
> "name": "[RFC] parsemail.py: Don't search for patches in replies",
> "diff": "SNIPPED!",
> "commit_ref": null,
> "pull_url": null,
> "archived": false,
> "hash": "312958438b253a6436397bb06816c09616d0833e",
> "submitter": 1,
> "project": 1,
> "delegate": null,
> "state": "New",
> "tags": []
> },
>
> (1) We should have two serializers: one for 'list' and one for 'detail'
> (or 'get'). I would exclude 'headers', 'content' and 'diff' from the
> 'list' response (and test this).
> (2) We should use links for the 'project'/'submitter' fields, rather
> than IDs. Alternatively, we could have a 'project_id' and
> 'project_url' field instead of simply 'project'. What do you prefer?
> (3) Should 'header' be a list, like 'tags'?
> (4) Could/should 'mbox_url' use an absolute link instead of the
> relative one?
(5) Use 'prefetch_related' on 'patch.tags', in addition to
'patch.checks'. There is a cascade of queries to the 'patchwork_tag'
field when accessing '/api/1.0/patches/' at the moment. In general,
we could probably do with making better use of 'defer',
'prefetch_related' and 'select_related'. The existing views code [1]
would be a good place to start here.
Stephen
[1] https://github.com/getpatchwork/patchwork/blob/8aae263/patchwork/views/__init__.py#L289
> I'm open to feedback on all of these, of course :) Also, apologies if
> the spec misguided you: I'll do some work on this over the weekend.
> _______________________________________________
> Patchwork mailing list
> Patchwork at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/patchwork
More information about the Patchwork
mailing list