From nobody Tue May 13 19:41:33 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1534601723188293.94689630923676; Sat, 18 Aug 2018 07:15:23 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DB66787624; Sat, 18 Aug 2018 14:15:21 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CC759309128B; Sat, 18 Aug 2018 14:15:21 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id BFECD181A12D; Sat, 18 Aug 2018 14:15:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w7IEAjEV020434 for ; Sat, 18 Aug 2018 10:10:45 -0400 Received: by smtp.corp.redhat.com (Postfix) id 2583E600C2; Sat, 18 Aug 2018 14:10:45 +0000 (UTC) Received: from mx1.redhat.com (ext-mx07.extmail.prod.ext.phx2.redhat.com [10.5.110.31]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1C044600C0 for ; Sat, 18 Aug 2018 14:10:45 +0000 (UTC) Received: from mail-wm0-f47.google.com (mail-wm0-f47.google.com [74.125.82.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B96D9C049E0F for ; Sat, 18 Aug 2018 14:10:43 +0000 (UTC) Received: by mail-wm0-f47.google.com with SMTP id q8-v6so9815560wmq.4 for ; Sat, 18 Aug 2018 07:10:43 -0700 (PDT) Received: from donizetti.lan (dynamic-adsl-78-12-184-244.clienti.tiscali.it. [78.12.184.244]) by smtp.gmail.com with ESMTPSA id g2-v6sm13874652wrd.71.2018.08.18.07.10.41 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 18 Aug 2018 07:10:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=71f3+hNVbiCnyNatYyasjMJOydujZnAidsHMnMxv6u8=; b=bXrO8LOjfgasrN5bjLzR5b4n/QYA3jMXS3zHnaFqfZlNj2VGAFZMuDHd3GCpFD2VMX 25FIGMA/OLqr697kNs51Lg9xA10YTh7n+lqbT2Q2+wwz2fF2K5AoAhXZ/kFlwXS9BJ7l CAwmsvYuDjHto6vEiabnDPcptvPqWj06sg1Ce0MIyjK140pB7u6/ONINkmAEGe26ZzXQ CbR54evjICUylmadG7fHwe/VrBNif8ZniUKnKTzvhL73kiOloej92s5EjY4qxcdKjRJA jI93iH3wSKuaeMgejPEOr36MheuGmyRJDN4eAl7RCN9GI+UNerqboSaUoDHzLvMLpZBH 8zfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=71f3+hNVbiCnyNatYyasjMJOydujZnAidsHMnMxv6u8=; b=cEOv0c3S1hw6QlzIRAJO6oTNmSmozf7BrMylEWtmlOOOqGqxIM2W7DQ4+dZGNMM3Cz giyP8CqyIbdeWH/zBo77BhfKs3gOgRMlQR0FD2R/YKAY2xavCqV3I2neluIZPDEk9opA Mb6dpybMxMSt6DtSzh9kST4sEghZIDsI2/NJQpcmfahBnTZGfpCBs3obS0sSq/qOMYop BiRGnEtyv6BkiWKi1M0nbg1XYkh2Za++S03hTLwNpWUKNymEa9CZgWLRdEShaNT1QlGD W/z/IbqMcx9WYJ+RjOcgDUve+YqUQm/xY/LwSUEmnUQU9yEoc/9o0qNNXmq8FTawEF7y Nnjw== X-Gm-Message-State: AOUpUlELK6MhwWhNdOxFwftShQkkHuG9KgQPey7kPjmoET8Ort+Wa14/ DV0ImMd4jyjDylmnurCrPTnPr6AL X-Google-Smtp-Source: AA+uWPygiVmtwdmuxVaBfo2pc3FezuporeAyWkpFUd+RFX47CcvVsByp0uPQO8X0MO/KFu88vbUiNg== X-Received: by 2002:a1c:c7cb:: with SMTP id x194-v6mr22189414wmf.117.1534601442140; Sat, 18 Aug 2018 07:10:42 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Sat, 18 Aug 2018 16:10:31 +0200 Message-Id: <20180818141033.29752-8-pbonzini@redhat.com> In-Reply-To: <20180818141033.29752-1-pbonzini@redhat.com> References: <20180818141033.29752-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Sat, 18 Aug 2018 14:10:44 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Sat, 18 Aug 2018 14:10:44 +0000 (UTC) for IP:'74.125.82.47' DOMAIN:'mail-wm0-f47.google.com' HELO:'mail-wm0-f47.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: -0.008 (DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, SPF_PASS) 74.125.82.47 mail-wm0-f47.google.com 74.125.82.47 mail-wm0-f47.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.78 on 10.5.110.31 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: patchew-devel@redhat.com Cc: Shubham Jain Subject: [Patchew-devel] [PATCH 7/9] rest: add support for PUT of result objects X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Sat, 18 Aug 2018 14:15:21 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDMRC_0 RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Shubham Jain This lets one use the REST API for the functionality of the old testing-rep= ort and applier-report endpoints. Signed-off-by: Shubham Jain Signed-off-by: Paolo Bonzini --- api/rest.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- mods/git.py | 12 +++++++++++- mods/testing.py | 10 +++++++++- 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/api/rest.py b/api/rest.py index df0640a..22d7c98 100644 --- a/api/rest.py +++ b/api/rest.py @@ -25,6 +25,9 @@ from rest_framework.response import Response import rest_framework from mbox import addr_db_to_rest, MboxMessage from rest_framework.parsers import JSONParser, BaseParser +from rest_framework.exceptions import ValidationError +import re +import mod =20 SEARCH_PARAM =3D 'q' =20 @@ -54,6 +57,12 @@ class PatchewPermission(permissions.BasePermission): return True return False =20 + def has_result_group_permission(self, request, view, result_renderer): + for grp in request.user.groups.all(): + if grp.name in result_renderer.allowed_groups: + return True + return False + def has_generic_permission(self, request, view): return (request.method in permissions.SAFE_METHODS) or \ self.is_superuser(request) or \ @@ -62,7 +71,9 @@ class PatchewPermission(permissions.BasePermission): def has_permission(self, request, view): return self.has_generic_permission(request, view) or \ (hasattr(view, 'project') and view.project and \ - self.has_project_permission(request, view, view.project)) + self.has_project_permission(request, view, view.project)) = or \ + (hasattr(view, 'result_renderer') and view.result_renderer = and \ + self.has_result_group_permission(request, view, view.resul= t_renderer)) =20 def has_object_permission(self, request, view, obj): # For non-project objects, has_project_permission has been evaluat= ed @@ -478,6 +489,7 @@ class ResultSerializer(serializers.ModelSerializer): class Meta: model =3D Result fields =3D ('resource_uri', 'name', 'status', 'last_update', 'data= ', 'log_url') + read_only_fields =3D ('name', 'last_update', ) =20 resource_uri =3D HyperlinkedResultField(view_name=3D'results-detail') log_url =3D SerializerMethodField(required=3DFalse) @@ -487,21 +499,54 @@ class ResultSerializer(serializers.ModelSerializer): request =3D self.context['request'] return obj.get_log_url(request) =20 + def validate(self, data): + data_serializer_class =3D self.context['renderer'].result_data_ser= ializer_class + data_serializer_class(data=3Ddata['data'], + context=3Dself.context).is_valid(raise_excep= tion=3DTrue) + return data + class ResultSerializerFull(ResultSerializer): class Meta: model =3D Result fields =3D ResultSerializer.Meta.fields + ('log',) + read_only_fields =3D ResultSerializer.Meta.read_only_fields =20 # The database field is log_xz, so this is needed here log =3D CharField(required=3DFalse) =20 class ResultsViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, - viewsets.GenericViewSet): + mixins.UpdateModelMixin, viewsets.GenericViewSet): lookup_field =3D 'name' lookup_value_regex =3D '[^/]+' filter_backends =3D (filters.OrderingFilter,) ordering_fields =3D ('name',) ordering =3D ('name',) + permission_classes =3D (PatchewPermission, ) + + # for permissions + @property + def project(self): + if hasattr(self, '__project'): + return self.__project + try: + self.__project =3D Project.objects.get(id=3Dself.kwargs['proje= cts_pk']) + except: + self.__project =3D None + return self.__project + + @property + def result_renderer(self): + try: + found =3D re.match("^[^.]*", self.kwargs['name']) + except: + return None + return mod.get_module(found.group(0)) if found else None + + def get_serializer_context(self): + context =3D super(ResultsViewSet, self).get_serializer_context() + if 'name' in self.kwargs: + context['renderer'] =3D self.result_renderer + return context =20 def get_serializer_class(self, *args, **kwargs): if self.lookup_field in self.kwargs: diff --git a/mods/git.py b/mods/git.py index 97db081..267546a 100644 --- a/mods/git.py +++ b/mods/git.py @@ -23,6 +23,8 @@ from api.rest import PluginMethodField, reverse_detail from api.views import APILoginRequiredView, prepare_series from patchew.logviewer import LogView from schema import * +from rest_framework import serializers +from rest_framework.fields import CharField =20 _instance =3D None =20 @@ -42,11 +44,19 @@ class GitLogViewer(LogView): raise Http404("Object not found: " + series) return obj.git_result =20 +class DataSerializer(serializers.Serializer): + base =3D CharField() + + # TODO: should be present iff the result is a success + repo =3D CharField(required=3DFalse) + url =3D CharField(required=3DFalse) + tag =3D CharField(required=3DFalse) =20 class GitModule(PatchewModule): """Git module""" name =3D "git" - + allowed_groups =3D ('importers', ) + result_data_serializer_class =3D DataSerializer project_property_schema =3D \ ArraySchema("git", desc=3D"Configuration for git module", members=3D[ diff --git a/mods/testing.py b/mods/testing.py index ecd63d1..98216d4 100644 --- a/mods/testing.py +++ b/mods/testing.py @@ -25,6 +25,8 @@ from api.search import SearchEngine from event import emit_event, declare_event, register_handler from patchew.logviewer import LogView from schema import * +from rest_framework import serializers +from rest_framework.fields import CharField, BooleanField =20 _instance =3D None =20 @@ -47,12 +49,18 @@ class TestingLogViewer(LogView): raise Http404("Object not found: " + project_or_series) return _instance.get_testing_result(obj, testing_name) =20 +class DataSerializer(serializers.Serializer): + # TODO: is_timeout should be present iff the result is a failure + is_timeout =3D BooleanField(required=3DFalse) + head =3D CharField() + tester =3D CharField(default=3Dserializers.CurrentUserDefault()) =20 class TestingModule(PatchewModule): """Testing module""" =20 name =3D "testing" - + allowed_groups =3D ('testers', ) + result_data_serializer_class =3D DataSerializer test_schema =3D \ ArraySchema("{name}", "Test", desc=3D"Test spec", members=3D[ --=20 2.17.1 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel