diff mbox series

[v2] models: Add commit_url_format to Project

Message ID 20190827061313.9202-1-mpe@ellerman.id.au
State Accepted
Headers show
Series [v2] models: Add commit_url_format to Project | expand

Commit Message

Michael Ellerman Aug. 27, 2019, 6:13 a.m. UTC
Add a new field to Project, commit_url_format, which specifies a
format string that can be used to generate a link to a particular
commit for a project.

This is used in the display of a patch, to render the patch's commit
as a clickable link back to the commit on the SCM website.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
---
 docs/api/schemas/latest/patchwork.yaml        |  7 +++++++
 docs/api/schemas/patchwork.j2                 |  7 +++++++
 docs/api/schemas/v1.2/patchwork.yaml          |  7 +++++++
 patchwork/api/embedded.py                     |  6 ++++--
 patchwork/api/project.py                      |  7 ++++---
 patchwork/fixtures/default_projects.xml       |  1 +
 .../0036_project_commit_url_format.py         | 20 +++++++++++++++++++
 patchwork/models.py                           |  5 +++++
 patchwork/templates/patchwork/submission.html |  2 +-
 patchwork/templatetags/patch.py               | 12 +++++++++++
 10 files changed, 68 insertions(+), 6 deletions(-)
 create mode 100644 patchwork/migrations/0036_project_commit_url_format.py

v2: Rebase on top of list archive changes.
    Added to the default projects fixture.
    Reworked the escaping to be more paranoid, it now escapes the result
    of applying the format string. Meaning even an admin shouldn't be
    able to do anything other than making the link point somewhere
    weird.

Comments

Daniel Axtens Aug. 30, 2019, 7:45 a.m. UTC | #1
Michael Ellerman <mpe@ellerman.id.au> writes:

Applied, thanks.


> Add a new field to Project, commit_url_format, which specifies a
> format string that can be used to generate a link to a particular
> commit for a project.
>
> This is used in the display of a patch, to render the patch's commit
> as a clickable link back to the commit on the SCM website.
>
> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
> ---
>  docs/api/schemas/latest/patchwork.yaml        |  7 +++++++
>  docs/api/schemas/patchwork.j2                 |  7 +++++++
>  docs/api/schemas/v1.2/patchwork.yaml          |  7 +++++++
>  patchwork/api/embedded.py                     |  6 ++++--
>  patchwork/api/project.py                      |  7 ++++---
>  patchwork/fixtures/default_projects.xml       |  1 +
>  .../0036_project_commit_url_format.py         | 20 +++++++++++++++++++
>  patchwork/models.py                           |  5 +++++
>  patchwork/templates/patchwork/submission.html |  2 +-
>  patchwork/templatetags/patch.py               | 12 +++++++++++
>  10 files changed, 68 insertions(+), 6 deletions(-)
>  create mode 100644 patchwork/migrations/0036_project_commit_url_format.py
>
> v2: Rebase on top of list archive changes.
>     Added to the default projects fixture.
>     Reworked the escaping to be more paranoid, it now escapes the result
>     of applying the format string. Meaning even an admin shouldn't be
>     able to do anything other than making the link point somewhere
>     weird.
>
> diff --git a/docs/api/schemas/latest/patchwork.yaml b/docs/api/schemas/latest/patchwork.yaml
> index 394655d..45a6118 100644
> --- a/docs/api/schemas/latest/patchwork.yaml
> +++ b/docs/api/schemas/latest/patchwork.yaml
> @@ -1893,6 +1893,9 @@ openapi: '3.0.0'
>            description: >
>              URL format for the list archive's Message-ID redirector. {} will be
>              replaced by the Message-ID.
> +        commit_url_format:
> +          title: Web SCM URL format for a particular commit
> +          type: string
>      Series:
>        type: object
>        properties:
> @@ -2217,6 +2220,10 @@ openapi: '3.0.0'
>            description: >
>              URL format for the list archive's Message-ID redirector. {} will be
>              replaced by the Message-ID.
> +        commit_url_format:
> +          title: Web SCM URL format for a particular commit
> +          type: string
> +          readOnly: true
>      SeriesEmbedded:
>        type: object
>        properties:
> diff --git a/docs/api/schemas/patchwork.j2 b/docs/api/schemas/patchwork.j2
> index 55e4c3b..843981f 100644
> --- a/docs/api/schemas/patchwork.j2
> +++ b/docs/api/schemas/patchwork.j2
> @@ -1917,6 +1917,9 @@ openapi: '3.0.0'
>            description: >
>              URL format for the list archive's Message-ID redirector. {} will be
>              replaced by the Message-ID.
> +        commit_url_format:
> +          title: Web SCM URL format for a particular commit
> +          type: string
>  {% endif %}
>      Series:
>        type: object
> @@ -2253,6 +2256,10 @@ openapi: '3.0.0'
>            description: >
>              URL format for the list archive's Message-ID redirector. {} will be
>              replaced by the Message-ID.
> +        commit_url_format:
> +          title: Web SCM URL format for a particular commit
> +          type: string
> +          readOnly: true
>  {% endif %}
>      SeriesEmbedded:
>        type: object
> diff --git a/docs/api/schemas/v1.2/patchwork.yaml b/docs/api/schemas/v1.2/patchwork.yaml
> index ab351e9..3a96aa3 100644
> --- a/docs/api/schemas/v1.2/patchwork.yaml
> +++ b/docs/api/schemas/v1.2/patchwork.yaml
> @@ -1893,6 +1893,9 @@ openapi: '3.0.0'
>            description: >
>              URL format for the list archive's Message-ID redirector. {} will be
>              replaced by the Message-ID.
> +        commit_url_format:
> +          title: Web SCM URL format for a particular commit
> +          type: string
>      Series:
>        type: object
>        properties:
> @@ -2217,6 +2220,10 @@ openapi: '3.0.0'
>            description: >
>              URL format for the list archive's Message-ID redirector. {} will be
>              replaced by the Message-ID.
> +        commit_url_format:
> +          title: Web SCM URL format for a particular commit
> +          type: string
> +          readOnly: true
>      SeriesEmbedded:
>        type: object
>        properties:
> diff --git a/patchwork/api/embedded.py b/patchwork/api/embedded.py
> index 968cb7f..de4f311 100644
> --- a/patchwork/api/embedded.py
> +++ b/patchwork/api/embedded.py
> @@ -163,13 +163,15 @@ from patchwork import models
>              model = models.Project
>              fields = ('id', 'url', 'name', 'link_name', 'list_id',
>                        'list_email', 'web_url', 'scm_url', 'webscm_url',
> -                      'list_archive_url', 'list_archive_url_format')
> +                      'list_archive_url', 'list_archive_url_format',
> +                      'commit_url_format')
>              read_only_fields = fields
>              extra_kwargs = {
>                  'url': {'view_name': 'api-project-detail'},
>              }
>              versioned_fields = {
> -                '1.2': ('list_archive_url', 'list_archive_url_format'),
> +                '1.2': ('list_archive_url', 'list_archive_url_format',
> +                        'commit_url_format'),
>              }
>  
>  
> diff --git a/patchwork/api/project.py b/patchwork/api/project.py
> index 62a8c3e..294d90b 100644
> --- a/patchwork/api/project.py
> +++ b/patchwork/api/project.py
> @@ -27,12 +27,13 @@ from patchwork.models import Project
>          fields = ('id', 'url', 'name', 'link_name', 'list_id', 'list_email',
>                    'web_url', 'scm_url', 'webscm_url', 'maintainers',
>                    'subject_match', 'list_archive_url',
> -                  'list_archive_url_format')
> +                  'list_archive_url_format', 'commit_url_format')
>          read_only_fields = ('name', 'link_name', 'list_id', 'list_email',
>                              'maintainers', 'subject_match')
>          versioned_fields = {
>              '1.1': ('subject_match', ),
> -            '1.2': ('list_archive_url', 'list_archive_url_format'),
> +            '1.2': ('list_archive_url', 'list_archive_url_format',
> +                    'commit_url_format'),
>          }
>          extra_kwargs = {
>              'url': {'view_name': 'api-project-detail'},
> @@ -71,7 +72,7 @@ from patchwork.models import Project
>  
>      search_fields = ('link_name', 'list_id', 'list_email', 'web_url',
>                       'scm_url', 'webscm_url', 'list_archive_url',
> -                     'list_archive_url_format')
> +                     'list_archive_url_format', 'commit_url_format')
>      ordering_fields = ('id', 'name', 'link_name', 'list_id')
>      ordering = 'id'
>  
> diff --git a/patchwork/fixtures/default_projects.xml b/patchwork/fixtures/default_projects.xml
> index a0877d9..e6b26bb 100644
> --- a/patchwork/fixtures/default_projects.xml
> +++ b/patchwork/fixtures/default_projects.xml
> @@ -7,5 +7,6 @@
>      <field type="CharField" name="listemail">patchwork@lists.ozlabs.org</field>
>      <field type="CharField" name="list_archive_url">https://lists.ozlabs.org/pipermail/patchwork/</field>
>      <field type="CharField" name="list_archive_url_format">http://mid.mail-archive.com/{}</field>
> +    <field type="CharField" name="commit_url_format">https://github.com/torvalds/linux/commit/{}</field>
>    </object>
>  </django-objects>
> diff --git a/patchwork/migrations/0036_project_commit_url_format.py b/patchwork/migrations/0036_project_commit_url_format.py
> new file mode 100644
> index 0000000..ab296d2
> --- /dev/null
> +++ b/patchwork/migrations/0036_project_commit_url_format.py
> @@ -0,0 +1,20 @@
> +# -*- coding: utf-8 -*-
> +# Generated by Django 1.11.22 on 2019-08-23 17:16
> +from __future__ import unicode_literals
> +
> +from django.db import migrations, models
> +
> +
> +class Migration(migrations.Migration):
> +
> +    dependencies = [
> +        ('patchwork', '0035_project_list_archive_url_format'),
> +    ]
> +
> +    operations = [
> +        migrations.AddField(
> +            model_name='project',
> +            name='commit_url_format',
> +            field=models.CharField(blank=True, help_text=b'URL format for a particular commit. {} will be replaced by the commit SHA.', max_length=2000),
> +        ),
> +    ]
> diff --git a/patchwork/models.py b/patchwork/models.py
> index 4d23396..32d1b3c 100644
> --- a/patchwork/models.py
> +++ b/patchwork/models.py
> @@ -82,6 +82,11 @@ from patchwork.hasher import hash_diff
>          max_length=2000, blank=True,
>          help_text="URL format for the list archive's Message-ID redirector. "
>          "{} will be replaced by the Message-ID.")
> +    commit_url_format = models.CharField(
> +        max_length=2000,
> +        blank=True,
> +        help_text='URL format for a particular commit. '
> +        '{} will be replaced by the commit SHA.')
>  
>      # configuration options
>  
> diff --git a/patchwork/templates/patchwork/submission.html b/patchwork/templates/patchwork/submission.html
> index 9cebbbe..e79dd92 100644
> --- a/patchwork/templates/patchwork/submission.html
> +++ b/patchwork/templates/patchwork/submission.html
> @@ -49,7 +49,7 @@ function toggle_div(link_id, headers_id)
>  {% if submission.commit_ref %}
>   <tr>
>    <th>Commit</th>
> -  <td>{{ submission.commit_ref }}</td>
> +  <td>{{ submission|patch_commit_display }}</td>
>   </tr>
>  {% endif %}
>  {% if submission.delegate %}
> diff --git a/patchwork/templatetags/patch.py b/patchwork/templatetags/patch.py
> index 757f873..d2537ba 100644
> --- a/patchwork/templatetags/patch.py
> +++ b/patchwork/templatetags/patch.py
> @@ -66,3 +66,15 @@ register = template.Library()
>  @stringfilter
>  def msgid(value):
>      return escape(value.strip('<>'))
> +
> +
> +@register.filter(name='patch_commit_display')
> +def patch_commit_display(patch):
> +    commit = patch.commit_ref
> +    fmt = patch.project.commit_url_format
> +
> +    if not fmt:
> +        return escape(commit)
> +
> +    return mark_safe('<a href="%s">%s</a>' % (escape(fmt.format(commit)),
> +                                              escape(commit)))
> -- 
> 2.21.0
>
> _______________________________________________
> Patchwork mailing list
> Patchwork@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/patchwork
diff mbox series

Patch

diff --git a/docs/api/schemas/latest/patchwork.yaml b/docs/api/schemas/latest/patchwork.yaml
index 394655d..45a6118 100644
--- a/docs/api/schemas/latest/patchwork.yaml
+++ b/docs/api/schemas/latest/patchwork.yaml
@@ -1893,6 +1893,9 @@  openapi: '3.0.0'
           description: >
             URL format for the list archive's Message-ID redirector. {} will be
             replaced by the Message-ID.
+        commit_url_format:
+          title: Web SCM URL format for a particular commit
+          type: string
     Series:
       type: object
       properties:
@@ -2217,6 +2220,10 @@  openapi: '3.0.0'
           description: >
             URL format for the list archive's Message-ID redirector. {} will be
             replaced by the Message-ID.
+        commit_url_format:
+          title: Web SCM URL format for a particular commit
+          type: string
+          readOnly: true
     SeriesEmbedded:
       type: object
       properties:
diff --git a/docs/api/schemas/patchwork.j2 b/docs/api/schemas/patchwork.j2
index 55e4c3b..843981f 100644
--- a/docs/api/schemas/patchwork.j2
+++ b/docs/api/schemas/patchwork.j2
@@ -1917,6 +1917,9 @@  openapi: '3.0.0'
           description: >
             URL format for the list archive's Message-ID redirector. {} will be
             replaced by the Message-ID.
+        commit_url_format:
+          title: Web SCM URL format for a particular commit
+          type: string
 {% endif %}
     Series:
       type: object
@@ -2253,6 +2256,10 @@  openapi: '3.0.0'
           description: >
             URL format for the list archive's Message-ID redirector. {} will be
             replaced by the Message-ID.
+        commit_url_format:
+          title: Web SCM URL format for a particular commit
+          type: string
+          readOnly: true
 {% endif %}
     SeriesEmbedded:
       type: object
diff --git a/docs/api/schemas/v1.2/patchwork.yaml b/docs/api/schemas/v1.2/patchwork.yaml
index ab351e9..3a96aa3 100644
--- a/docs/api/schemas/v1.2/patchwork.yaml
+++ b/docs/api/schemas/v1.2/patchwork.yaml
@@ -1893,6 +1893,9 @@  openapi: '3.0.0'
           description: >
             URL format for the list archive's Message-ID redirector. {} will be
             replaced by the Message-ID.
+        commit_url_format:
+          title: Web SCM URL format for a particular commit
+          type: string
     Series:
       type: object
       properties:
@@ -2217,6 +2220,10 @@  openapi: '3.0.0'
           description: >
             URL format for the list archive's Message-ID redirector. {} will be
             replaced by the Message-ID.
+        commit_url_format:
+          title: Web SCM URL format for a particular commit
+          type: string
+          readOnly: true
     SeriesEmbedded:
       type: object
       properties:
diff --git a/patchwork/api/embedded.py b/patchwork/api/embedded.py
index 968cb7f..de4f311 100644
--- a/patchwork/api/embedded.py
+++ b/patchwork/api/embedded.py
@@ -163,13 +163,15 @@  from patchwork import models
             model = models.Project
             fields = ('id', 'url', 'name', 'link_name', 'list_id',
                       'list_email', 'web_url', 'scm_url', 'webscm_url',
-                      'list_archive_url', 'list_archive_url_format')
+                      'list_archive_url', 'list_archive_url_format',
+                      'commit_url_format')
             read_only_fields = fields
             extra_kwargs = {
                 'url': {'view_name': 'api-project-detail'},
             }
             versioned_fields = {
-                '1.2': ('list_archive_url', 'list_archive_url_format'),
+                '1.2': ('list_archive_url', 'list_archive_url_format',
+                        'commit_url_format'),
             }
 
 
diff --git a/patchwork/api/project.py b/patchwork/api/project.py
index 62a8c3e..294d90b 100644
--- a/patchwork/api/project.py
+++ b/patchwork/api/project.py
@@ -27,12 +27,13 @@  from patchwork.models import Project
         fields = ('id', 'url', 'name', 'link_name', 'list_id', 'list_email',
                   'web_url', 'scm_url', 'webscm_url', 'maintainers',
                   'subject_match', 'list_archive_url',
-                  'list_archive_url_format')
+                  'list_archive_url_format', 'commit_url_format')
         read_only_fields = ('name', 'link_name', 'list_id', 'list_email',
                             'maintainers', 'subject_match')
         versioned_fields = {
             '1.1': ('subject_match', ),
-            '1.2': ('list_archive_url', 'list_archive_url_format'),
+            '1.2': ('list_archive_url', 'list_archive_url_format',
+                    'commit_url_format'),
         }
         extra_kwargs = {
             'url': {'view_name': 'api-project-detail'},
@@ -71,7 +72,7 @@  from patchwork.models import Project
 
     search_fields = ('link_name', 'list_id', 'list_email', 'web_url',
                      'scm_url', 'webscm_url', 'list_archive_url',
-                     'list_archive_url_format')
+                     'list_archive_url_format', 'commit_url_format')
     ordering_fields = ('id', 'name', 'link_name', 'list_id')
     ordering = 'id'
 
diff --git a/patchwork/fixtures/default_projects.xml b/patchwork/fixtures/default_projects.xml
index a0877d9..e6b26bb 100644
--- a/patchwork/fixtures/default_projects.xml
+++ b/patchwork/fixtures/default_projects.xml
@@ -7,5 +7,6 @@ 
     <field type="CharField" name="listemail">patchwork@lists.ozlabs.org</field>
     <field type="CharField" name="list_archive_url">https://lists.ozlabs.org/pipermail/patchwork/</field>
     <field type="CharField" name="list_archive_url_format">http://mid.mail-archive.com/{}</field>
+    <field type="CharField" name="commit_url_format">https://github.com/torvalds/linux/commit/{}</field>
   </object>
 </django-objects>
diff --git a/patchwork/migrations/0036_project_commit_url_format.py b/patchwork/migrations/0036_project_commit_url_format.py
new file mode 100644
index 0000000..ab296d2
--- /dev/null
+++ b/patchwork/migrations/0036_project_commit_url_format.py
@@ -0,0 +1,20 @@ 
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.22 on 2019-08-23 17:16
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('patchwork', '0035_project_list_archive_url_format'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='project',
+            name='commit_url_format',
+            field=models.CharField(blank=True, help_text=b'URL format for a particular commit. {} will be replaced by the commit SHA.', max_length=2000),
+        ),
+    ]
diff --git a/patchwork/models.py b/patchwork/models.py
index 4d23396..32d1b3c 100644
--- a/patchwork/models.py
+++ b/patchwork/models.py
@@ -82,6 +82,11 @@  from patchwork.hasher import hash_diff
         max_length=2000, blank=True,
         help_text="URL format for the list archive's Message-ID redirector. "
         "{} will be replaced by the Message-ID.")
+    commit_url_format = models.CharField(
+        max_length=2000,
+        blank=True,
+        help_text='URL format for a particular commit. '
+        '{} will be replaced by the commit SHA.')
 
     # configuration options
 
diff --git a/patchwork/templates/patchwork/submission.html b/patchwork/templates/patchwork/submission.html
index 9cebbbe..e79dd92 100644
--- a/patchwork/templates/patchwork/submission.html
+++ b/patchwork/templates/patchwork/submission.html
@@ -49,7 +49,7 @@  function toggle_div(link_id, headers_id)
 {% if submission.commit_ref %}
  <tr>
   <th>Commit</th>
-  <td>{{ submission.commit_ref }}</td>
+  <td>{{ submission|patch_commit_display }}</td>
  </tr>
 {% endif %}
 {% if submission.delegate %}
diff --git a/patchwork/templatetags/patch.py b/patchwork/templatetags/patch.py
index 757f873..d2537ba 100644
--- a/patchwork/templatetags/patch.py
+++ b/patchwork/templatetags/patch.py
@@ -66,3 +66,15 @@  register = template.Library()
 @stringfilter
 def msgid(value):
     return escape(value.strip('<>'))
+
+
+@register.filter(name='patch_commit_display')
+def patch_commit_display(patch):
+    commit = patch.commit_ref
+    fmt = patch.project.commit_url_format
+
+    if not fmt:
+        return escape(commit)
+
+    return mark_safe('<a href="%s">%s</a>' % (escape(fmt.format(commit)),
+                                              escape(commit)))