<div><br><div class="gmail_quote"><div dir="auto">On Thu, 24 May 2018 at 9:39 PM, Paolo Bonzini <<a href="mailto:pbonzini@redhat.com">pbonzini@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 23/05/2018 21:16, Shubham Jain wrote:<br>
> moved and refactored the UpdateProjectHeadView.handle() into method of api.models.Project so that it can be re-used in rest conversion of update-project-head<br>
> ---<br>
>  api/models.py | 31 +++++++++++++++++++++++++++++++<br>
>  api/views.py  | 29 +++--------------------------<br>
>  2 files changed, 34 insertions(+), 26 deletions(-)<br>
> <br>
> diff --git a/api/models.py b/api/models.py<br>
> index d602cb7..1a51a6d 100644<br>
> --- a/api/models.py<br>
> +++ b/api/models.py<br>
> @@ -171,6 +171,37 @@ class Project(models.Model):<br>
>      def get_subprojects(self):<br>
>          return Project.objects.filter(parent_project=self)<br>
>  <br>
> +    def get_project_head(self):<br>
> +        return self.get_property("git.head")<br>
> +<br>
> +    def set_project_head(self, new_head):<br>
> +        self.set_property("git.head", new_head)<br>
> +<br>
> +    project_head = property(get_project_head,set_project_head)<br>
<br>
Fam, what do you think about making git.head a proper field in the<br>
model, rather than a property?<br>
<br>
Shubham, if Fam agrees, would you like to try it?  It's outside the REST<br>
API project, but it is an interesting experience with Django to write<br>
the migration code etc.</blockquote><div dir="auto">Yes. Can you elaborate? </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
The patch looks okay to me - I cannot commit it right now, but perhaps<br>
Fam can do it for me?<br>
<br>
Thanks,<br>
<br>
Paolo<br>
<br>
> +<br>
> +    def series_update(self, message_ids):<br>
> +        updated_series = []<br>
> +        for msgid in message_ids:<br>
> +            if msgid.startswith("<") and msgid.endswith(">"):<br>
> +                msgid = msgid[1:-1]<br>
> +            mo = Message.objects.filter(project=self, message_id=msgid,<br>
> +                                            is_merged=False).first()<br>
> +            if not mo:<br>
> +                continue<br>
> +            mo.is_merged = True<br>
> +            mo.save()<br>
> +            s = mo.get_series_head()<br>
> +            if s:<br>
> +                updated_series.append(s)<br>
> +        for s in updated_series:<br>
> +            for p in series.get_patches():<br>
> +                if not p.is_merged:<br>
> +                    break<br>
> +            else:<br>
> +                series.is_merged = True<br>
> +                series.save()<br>
> +        return len(updated_series)<br>
> +<br>
>  class ProjectProperty(models.Model):<br>
>      project = models.ForeignKey('Project', on_delete=models.CASCADE)<br>
>      name = models.CharField(max_length=1024, db_index=True)<br>
> diff --git a/api/views.py b/api/views.py<br>
> index c27cd5a..7a37481 100644<br>
> --- a/api/views.py<br>
> +++ b/api/views.py<br>
> @@ -120,34 +120,11 @@ class UpdateProjectHeadView(APILoginRequiredView):<br>
>  <br>
>      def handle(self, request, project, old_head, new_head, message_ids):<br>
>          po = Project.objects.get(name=project)<br>
> -        old_head_0 = po.get_property("git.head")<br>
> +        old_head_0 = po.project_head<br>
>          if old_head_0 and old_head_0 != old_head:<br>
>              raise Exception("wrong old head")<br>
> -        ret = 0<br>
> -        updated_series = []<br>
> -        for msgid in message_ids:<br>
> -            if msgid.startswith("<") and msgid.endswith(">"):<br>
> -                msgid = msgid[1:-1]<br>
> -            mo = Message.objects.filter(project=po, message_id=msgid,<br>
> -                                        is_merged=False).first()<br>
> -            if not mo:<br>
> -                continue<br>
> -            ret += 1<br>
> -            mo.is_merged = True<br>
> -            mo.save()<br>
> -            s = mo.get_series_head()<br>
> -            if s:<br>
> -                updated_series.append(s)<br>
> -        for s in updated_series:<br>
> -            merged = True<br>
> -            for p in s.get_patches():<br>
> -                if not p.is_merged:<br>
> -                    merged = False<br>
> -                    break<br>
> -            if merged:<br>
> -                s.is_merged = True<br>
> -                s.save()<br>
> -        po.set_property("git.head", new_head)<br>
> +        ret = po.series_update(message_ids)<br>
> +        po.project_head = new_head<br>
>          return ret<br>
>  <br>
>  class SetPropertyView(APILoginRequiredView):<br>
> </blockquote><div dir="auto">Also, if one of you can elaborate the use of pluginmethod field. I tried going through code and experiment around it but it wasn’t a much help. </div><div dir="auto">Thanks</div><div dir="auto">Shubham</div></div></div>