Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ Issue #509 + #510] Series views #589

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions patchwork/templates/patchwork/series-detail.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{% extends "base.html" %}

{% load humanize %}
{% load syntax %}
{% load person %}
{% load patch %}
{% load static %}
{% load utils %}

{% block title %}{{series.name}}{% endblock %}

{% block body %}

<div>
<h1>{{ series.name }}</h1>
</div>

<table class="patch-meta">
<tr>
<th>Cover Letter</th>
<td>{{ series.cover_letter.content|default:"No cover letter available" }}</td>
</tr>
<tr>
<th>Date</th>
<td>{{ series.date }}</td>
</tr>
<tr>
<th>Submitter</th>
<td>{{ series.submitter }}</td>
</tr>
<tr>
<th>Total</th>
<td>{{ series.patches }}</td>
</tr>
</table>
<br>
<h2>Patches:</h2>
<br>
{% include "patchwork/partials/patch-list.html" %}

{% endblock %}
98 changes: 98 additions & 0 deletions patchwork/templates/patchwork/series-list.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
{% extends "base.html" %}

{% load person %}
{% load static %}

{% block title %}{{project.name}}{% endblock %}
{% block series_active %}active{% endblock %}

{% block body %}

{% load person %}
{% load listurl %}
{% load patch %}
{% load project %}
{% load static %}

{% include "patchwork/partials/pagination.html" %}

<input type="hidden" name="form" value="serieslistform"/>
<input type="hidden" name="project" value="{{project.id}}"/>

<table id="serieslist" class="table table-hover table-extra-condensed table-striped pw-list" data-toggle="checkboxes" data-range="true">
<thead>
<tr>
{% if user.is_authenticated and user.profile.show_ids %}
<th>
ID
</th>
{% endif %}

<th>
<span class="colinactive">Series</span>
</th>

<th>
Version
</th>

<th>
<span class="colinactive">Cover Letter</span>
</th>

<th>
<span class="colinactive">Patches</span>
</th>

<th>
<span class="colinactive">Date</span>
</th>

<th>
<span class="colinactive">Submitter</span>
</th>
</tr>
</thead>

<tbody>
{% for series in page %}
<tr id="series_row:{{series.id}}">
{% if user.is_authenticated and user.profile.show_ids %}
<td>
<button type="button" class="btn btn-xs btn-copy" data-clipboard-text="{{ series.id }}" title="Copy to Clipboard">
{{ series.id }}
</button>
</td>
{% endif %}
<td>
<a href="{% url 'series-detail' project_id=project.linkname series_id=series.id %}">
{{ series.name|default:"[no subject]"|truncatechars:100 }}
</a>
</td>
<td>
{{ series.version|default:"-"}}
</td>

<td>
{% if series.cover_letter.content %}
<b>&check;</b>
{% else %}
-
{% endif %}
</td>
<td>{{ series.received_total}}</td>
<td class="text-nowrap">{{ series.date|date:"Y-m-d" }}</td>
<td>{{ series.submitter|personify:project }}</td>
</tr>
{% empty %}
<tr>
<td colspan="8">No series to display</td>
</tr>
{% endfor %}
</tbody>
</table>

{% if page.paginator.count %}
{% include "patchwork/partials/pagination.html" %}
{% endif %}
{% endblock %}
16 changes: 16 additions & 0 deletions patchwork/templates/patchwork/submission.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,22 @@
<h1>{{ submission.name }}</h1>
</div>

<div class="btn-group pull-right">
<a class="btn btn-default {% if not next_submission %} disabled {% endif %}"
{% if next_submission %} href="{% url 'patch-detail' project_id=project.linkname msgid=next_submission.encoded_msgid %}" {% endif %}>
next
</a>
</div>

<div class="btn-group pull-right">
<a
class="btn btn-default {% if not previous_submission %} disabled {% endif %}"
{% if previous_submission %} href="{% url 'patch-detail' project_id=project.linkname msgid=previous_submission.encoded_msgid %}" {% endif %}
>
previous
</a>
</div>

<table id="patch-meta" class="patch-meta" data-submission-type={{submission|verbose_name_plural|lower}} data-submission-id={{submission.id}}>
<tr>
<th>Message ID</th>
Expand Down
51 changes: 51 additions & 0 deletions patchwork/tests/views/test_series.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Patchwork - automated patch tracking system
# Copyright (C) 2012 Jeremy Kerr <jk@ozlabs.org>
#
# SPDX-License-Identifier: GPL-2.0-or-later

from datetime import datetime as dt

from django.test import TestCase
from django.urls import reverse

from patchwork.models import Person
from patchwork.tests.utils import create_patch
from patchwork.tests.utils import create_cover
from patchwork.tests.utils import create_person
from patchwork.tests.utils import create_project
from patchwork.tests.utils import create_series
from patchwork.tests.utils import create_user


class SeriesList(TestCase):
def setUp(self):
self.project = create_project()
self.user = create_user()
self.person_1 = Person.objects.get(user=self.user)
self.person_2 = create_person()
self.series_1 = create_series(project=self.project)
self.series_2 = create_series(project=self.project)
create_cover(project=self.project, series=self.series_1)

for i in range(5):
create_patch(
submitter=self.person_1,
project=self.project,
series=self.series_1,
date=dt(2014, 3, 16, 13, 4, 50, 155643),
)
create_patch(
submitter=self.person_2,
project=self.project,
series=self.series_2,
date=dt(2014, 3, 16, 13, 4, 50, 155643),
)

def test_series_list(self):
requested_url = reverse(
'series-list',
kwargs={'project_id': self.project.linkname},
)
response = self.client.get(requested_url)

self.assertEqual(response.status_code, 200)
12 changes: 11 additions & 1 deletion patchwork/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,15 @@
path('admin/', admin.site.urls),
path('', project_views.project_list, name='project-list'),
path(
'project/<project_id>/list/',
'project/<project_id>/patches/',
patch_views.patch_list,
name='patch-list',
),
path(
'project/<project_id>/series/',
series_views.series_list,
name='series-list',
),
path(
'project/<project_id>/bundles/',
bundle_views.bundle_list,
Expand Down Expand Up @@ -110,6 +115,11 @@
name='comment-redirect',
),
# series views
path(
'project/<project_id>/series/<int:series_id>/',
series_views.series_detail,
name='series-detail',
),
path(
'series/<int:series_id>/mbox/',
series_views.series_mbox,
Expand Down
14 changes: 14 additions & 0 deletions patchwork/views/patch.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,20 @@ def patch_detail(request, project_id, msgid):
context['related_same_project'] = related_same_project
context['related_different_project'] = related_different_project

try:
context['previous_submission'] = Patch.objects.get(
series=patch.series, number=patch.number - 1
)
except Patch.DoesNotExist:
context['previous_submission'] = None

try:
context['next_submission'] = Patch.objects.get(
series=patch.series, number=patch.number + 1
)
except Patch.DoesNotExist:
context['next_submission'] = None

return render(request, 'patchwork/submission.html', context)


Expand Down
62 changes: 62 additions & 0 deletions patchwork/views/series.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,18 @@
# Copyright (C) 2017 Stephen Finucane <stephen@that.guru>
#
# SPDX-License-Identifier: GPL-2.0-or-later
import collections

from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.shortcuts import render

from patchwork.models import Series
from patchwork.models import Patch
from patchwork.models import Project
from patchwork.views import generic_list
from patchwork.views.utils import series_to_mbox
from patchwork.paginator import Paginator


def series_mbox(request, series_id):
Expand All @@ -20,3 +26,59 @@ def series_mbox(request, series_id):
)

return response


def series_detail(request, project_id, series_id):
series = get_object_or_404(Series, id=series_id)

patches = Patch.objects.filter(series=series)

context = generic_list(
request,
series.project,
'series-detail',
view_args={
'project_id': project_id,
'series_id': series_id,
},
patches=patches,
)

context.update({'series': series})

return render(request, 'patchwork/series-detail.html', context)


def series_list(request, project_id):
project = get_object_or_404(Project, linkname=project_id)
context = {}
series_list = (
Series.objects.filter(project=project)
.only(
'submitter',
'project',
'version',
'name',
'date',
'id',
)
.select_related('project')
.order_by('date')
)

paginator = Paginator(request, series_list)
context.update(
{
'project': project,
'projects': Project.objects.all(),
'series_list': series_list,
'page': paginator.current_page,
'list_view': {
'view': 'series-list',
'view_params': {'project_id': project.linkname},
'params': collections.OrderedDict(),
},
}
)

return render(request, 'patchwork/series-list.html', context)
11 changes: 11 additions & 0 deletions releasenotes/notes/add_series_list_view-bf219022216fea6a.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
prelude: >
Some projects can have hundreds of patches actives at once, by giving the user
the ability to have an overview of all of the series makes knowing what's the
current state of a project much more simple.
features:
- |
Add series-list view, a view containing all of the series for a project and that also
implements the SeriesBulkUpdatePatchesForm, allowing the user to edit all of the patches
within a series using the web ui.
Add series-detail view, a view containing details about a series and all of it's patches
6 changes: 6 additions & 0 deletions templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@
{% block navbarmenu %}
{% if project %}
<ul class="nav navbar-nav">
<li class="{% block series_active %}{% endblock %}">
<a href="{% url 'series-list' project_id=project.linkname %}">
<span class="glyphicon glyphicon-book"></span>
Series
</a>
</li>
<li class="{% block patch_active %}{% endblock %}">
<a href="{% url 'patch-list' project_id=project.linkname %}">
<span class="glyphicon glyphicon-file"></span>
Expand Down
Loading