[Patchew-devel] [PATCH v2] Refactoring of UpdateProjectHeadView.handle()

Paolo Bonzini pbonzini at redhat.com
Thu May 24 16:09:39 UTC 2018


On 23/05/2018 21:16, Shubham Jain wrote:
> 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
> ---
>  api/models.py | 31 +++++++++++++++++++++++++++++++
>  api/views.py  | 29 +++--------------------------
>  2 files changed, 34 insertions(+), 26 deletions(-)
> 
> diff --git a/api/models.py b/api/models.py
> index d602cb7..1a51a6d 100644
> --- a/api/models.py
> +++ b/api/models.py
> @@ -171,6 +171,37 @@ class Project(models.Model):
>      def get_subprojects(self):
>          return Project.objects.filter(parent_project=self)
>  
> +    def get_project_head(self):
> +        return self.get_property("git.head")
> +
> +    def set_project_head(self, new_head):
> +        self.set_property("git.head", new_head)
> +
> +    project_head = property(get_project_head,set_project_head)

Fam, what do you think about making git.head a proper field in the
model, rather than a property?

Shubham, if Fam agrees, would you like to try it?  It's outside the REST
API project, but it is an interesting experience with Django to write
the migration code etc.

The patch looks okay to me - I cannot commit it right now, but perhaps
Fam can do it for me?

Thanks,

Paolo

> +
> +    def series_update(self, message_ids):
> +        updated_series = []
> +        for msgid in message_ids:
> +            if msgid.startswith("<") and msgid.endswith(">"):
> +                msgid = msgid[1:-1]
> +            mo = Message.objects.filter(project=self, message_id=msgid,
> +                                            is_merged=False).first()
> +            if not mo:
> +                continue
> +            mo.is_merged = True
> +            mo.save()
> +            s = mo.get_series_head()
> +            if s:
> +                updated_series.append(s)
> +        for s in updated_series:
> +            for p in series.get_patches():
> +                if not p.is_merged:
> +                    break
> +            else:
> +                series.is_merged = True
> +                series.save()
> +        return len(updated_series)
> +
>  class ProjectProperty(models.Model):
>      project = models.ForeignKey('Project', on_delete=models.CASCADE)
>      name = models.CharField(max_length=1024, db_index=True)
> diff --git a/api/views.py b/api/views.py
> index c27cd5a..7a37481 100644
> --- a/api/views.py
> +++ b/api/views.py
> @@ -120,34 +120,11 @@ class UpdateProjectHeadView(APILoginRequiredView):
>  
>      def handle(self, request, project, old_head, new_head, message_ids):
>          po = Project.objects.get(name=project)
> -        old_head_0 = po.get_property("git.head")
> +        old_head_0 = po.project_head
>          if old_head_0 and old_head_0 != old_head:
>              raise Exception("wrong old head")
> -        ret = 0
> -        updated_series = []
> -        for msgid in message_ids:
> -            if msgid.startswith("<") and msgid.endswith(">"):
> -                msgid = msgid[1:-1]
> -            mo = Message.objects.filter(project=po, message_id=msgid,
> -                                        is_merged=False).first()
> -            if not mo:
> -                continue
> -            ret += 1
> -            mo.is_merged = True
> -            mo.save()
> -            s = mo.get_series_head()
> -            if s:
> -                updated_series.append(s)
> -        for s in updated_series:
> -            merged = True
> -            for p in s.get_patches():
> -                if not p.is_merged:
> -                    merged = False
> -                    break
> -            if merged:
> -                s.is_merged = True
> -                s.save()
> -        po.set_property("git.head", new_head)
> +        ret = po.series_update(message_ids)
> +        po.project_head = new_head
>          return ret
>  
>  class SetPropertyView(APILoginRequiredView):
> 




More information about the Patchew-devel mailing list