[PATCH] A new page that displays the patches for which the user is waiting feedback

Guilherme Salgado guilherme.salgado at linaro.org
Fri Apr 29 23:25:01 EST 2011


Hi Jeremy,

This patch is marked on patchwork.ozlabs.org as having changes
requested, but I didn't get a reply from you about it.  Is that because
of the test changes to use the factory singleton rather than creating a
new instance?  If that's the case, I'd rather do those changes together
with any other changes you might want.

Cheers,

On Fri, 2011-04-15 at 17:45 -0300, Guilherme Salgado wrote:
> This page shows all patches in a state that requires action and that have been
> submitted by the logged in user to a given project.
> 
> Also, the profile page now has an extra section with links to this page for
> every project on which the user has patches that need feedback.
> 
> Signed-off-by: Guilherme Salgado <guilherme.salgado at linaro.org>
> ---
>  apps/patchwork/models.py         |    6 +++++
>  apps/patchwork/tests/__init__.py |    1 +
>  apps/patchwork/tests/models.py   |   46 ++++++++++++++++++++++++++++++++++++++
>  apps/patchwork/urls.py           |    2 ++
>  apps/patchwork/views/user.py     |   27 +++++++++++++++++++---
>  5 files changed, 78 insertions(+), 4 deletions(-)
>  create mode 100644 apps/patchwork/tests/models.py
> 
> diff --git a/apps/patchwork/models.py b/apps/patchwork/models.py
> index 6c8fc71..6a7ffc5 100644
> --- a/apps/patchwork/models.py
> +++ b/apps/patchwork/models.py
> @@ -104,6 +104,12 @@ class UserProfile(models.Model):
>      def n_todo_patches(self):
>          return self.todo_patches().count()
>  
> +    def submitted_patches_waiting_feedback(self, project):
> +        people = Person.objects.filter(user=self.user)
> +        states = State.objects.filter(action_required=True)
> +        return Patch.objects.filter(
> +            project=project, submitter__in=people, state__in=states)
> +
>      def todo_patches(self, project = None):
>  
>          # filter on project, if necessary
> diff --git a/apps/patchwork/tests/__init__.py b/apps/patchwork/tests/__init__.py
> index 68fe563..3adbbe7 100644
> --- a/apps/patchwork/tests/__init__.py
> +++ b/apps/patchwork/tests/__init__.py
> @@ -23,3 +23,4 @@ from patchwork.tests.bundles import *
>  from patchwork.tests.mboxviews import *
>  from patchwork.tests.updates import *
>  from patchwork.tests.filters import *
> +from patchwork.tests.models import *
> diff --git a/apps/patchwork/tests/models.py b/apps/patchwork/tests/models.py
> new file mode 100644
> index 0000000..501100e
> --- /dev/null
> +++ b/apps/patchwork/tests/models.py
> @@ -0,0 +1,46 @@
> +
> +from django.test import TestCase
> +
> +from patchwork.models import State
> +from patchwork.tests.factory import ObjectFactory
> +
> +
> +class UserProfileTestCase(TestCase):
> +
> +    def setUp(self):
> +        super(UserProfileTestCase, self).setUp()
> +        self.factory = ObjectFactory()
> +
> +    def test_submitted_patches_waiting_feedback(self):
> +        # Create two people linked to the same user.
> +        person = self.factory.makePerson(is_user=True)
> +        profile = person.user.get_profile()
> +        person2 = self.factory.makePerson(is_user=False)
> +        person2.user = person.user
> +        person2.save()
> +
> +        # Create 3 patches that
> +        #   - apply to the same project;
> +        #   - have been submitted by a Person linked to our newly created user
> +        # Of those 3 patches, only the first two are in a state that needs
> +        # action, so only those will be returned by
> +        # submitted_patches_waiting_feedback().
> +        # We also create a couple more patches, but one of them applies to a
> +        # different project than the ones created above and the other has not
> +        # been submitted by a Person linked to our user, so they are not in
> +        # the patches returned by submitted_patches_waiting_feedback().
> +        patch1 = self.factory.makePatch(submitter=person)
> +        project = patch1.project
> +        patch2 = self.factory.makePatch(project=project, submitter=person2)
> +        patch3 = self.factory.makePatch(project=project, submitter=person2)
> +        patch3.state = State.objects.get(name='Accepted')
> +        patch3.save()
> +        patch4 = self.factory.makePatch(submitter=person2)
> +        patch5 = self.factory.makePatch(project=project)
> +
> +        # Here we see that UserProfile.submitted_patches_waiting_feedback()
> +        # only returns the two patches that are in a state that requires
> +        # action and that have been submitted by a person linked to that
> +        # profile.
> +        patches = profile.submitted_patches_waiting_feedback(patch1.project)
> +        self.assertEquals([patch1, patch2], list(patches))
> diff --git a/apps/patchwork/urls.py b/apps/patchwork/urls.py
> index b49b4e1..984b843 100644
> --- a/apps/patchwork/urls.py
> +++ b/apps/patchwork/urls.py
> @@ -33,6 +33,8 @@ urlpatterns = patterns('',
>  
>      # logged-in user stuff
>      (r'^user/$', 'patchwork.views.user.profile'),
> +    (r'^user/submitted/(?P<project_id>[^/]+)/$',
> +        'patchwork.views.user.submitted_patches_list'),
>      (r'^user/todo/$', 'patchwork.views.user.todo_lists'),
>      (r'^user/todo/(?P<project_id>[^/]+)/$', 'patchwork.views.user.todo_list'),
>  
> diff --git a/apps/patchwork/views/user.py b/apps/patchwork/views/user.py
> index 1ae3c2d..6220156 100644
> --- a/apps/patchwork/views/user.py
> +++ b/apps/patchwork/views/user.py
> @@ -36,15 +36,22 @@ import django.core.urlresolvers
>  def profile(request):
>      context = PatchworkRequestContext(request)
>  
> +    profile = request.user.get_profile()
>      if request.method == 'POST':
> -        form = UserProfileForm(instance = request.user.get_profile(),
> -                data = request.POST)
> +        form = UserProfileForm(instance = profile, data = request.POST)
>          if form.is_valid():
>              form.save()
>      else:
> -        form = UserProfileForm(instance = request.user.get_profile())
> +        form = UserProfileForm(instance = profile)
>  
> -    context.project = request.user.get_profile().primary_project
> +    patches_waiting_for_feedback = {}
> +    for project in profile.contributor_projects():
> +        patches = profile.submitted_patches_waiting_feedback(project)
> +        if patches.count() > 0:
> +            patches_waiting_for_feedback[project] = patches
> +    context['patches_waiting_for_feedback'] = patches_waiting_for_feedback
> +
> +    context.project = profile.primary_project
>      context['bundles'] = Bundle.objects.filter(owner = request.user)
>      context['profileform'] = form
>  
> @@ -109,6 +116,18 @@ def unlink(request, person_id):
>  
> 
>  @login_required
> +def submitted_patches_list(request, project_id):
> +    project = get_object_or_404(Project, linkname=project_id)
> +    profile = request.user.get_profile()
> +    context = generic_list(
> +        request, project, 'patchwork.views.user.submitted_patches_list',
> +        view_args={'project_id': project_id},
> +        patches=profile.submitted_patches_waiting_feedback(project))
> +
> +    return render_to_response('patchwork/submitted-list.html', context)
> +
> +
> + at login_required
>  def todo_lists(request):
>      todo_lists = []
>  
> diff --git a/templates/patchwork/profile.html b/templates/patchwork/profile.html
> index 44df921..d4759c7 100644
> --- a/templates/patchwork/profile.html
> +++ b/templates/patchwork/profile.html
> @@ -36,6 +36,19 @@ Contributor to
>  </div>
>  
>  <div class="box">
> +<h2>Patches for which you are waiting feedback</h2>
> + {% if patches_waiting_for_feedback %}
> +  {% for project, patches in patches_waiting_for_feedback.items %}
> +   <p><a href="{% url patchwork.views.user.submitted_patches_list project.linkname %}">
> +    {{ patches.count }} <strong>{{ project.linkname }}</strong> patches</a>
> +   </p>
> +  {% endfor %}
> + {% else %}
> +  <p>There doesn't seem to be any patches for which you are waiting feedback.</p>
> + {% endif %}
> +</div>
> +
> +<div class="box">
>  <h2>Linked email addresses</h2>
>  <p>The following email addresses are associated with this patchwork account.
>  Adding alternative addresses allows patchwork to group contributions that
> diff --git a/templates/patchwork/submitted-list.html b/templates/patchwork/submitted-list.html
> new file mode 100644
> index 0000000..1604187
> --- /dev/null
> +++ b/templates/patchwork/submitted-list.html
> @@ -0,0 +1,14 @@
> +{% extends "base.html" %}
> +
> +{% load person %}
> +
> +{% block title %}Your patches for {{ project.name }}{% endblock %}
> +{% block heading %}Your patches for {{ project.name }}{% endblock %}
> +
> +{% block body %}
> +
> +<h2>Patches for which you are waiting feedback</h2>
> +
> +{% include "patchwork/patch-list.html" %}
> +
> +{% endblock %}
> 
> _______________________________________________
> Patchwork mailing list
> Patchwork at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/patchwork

-- 
Guilherme Salgado <https://launchpad.net/~salgado>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://lists.ozlabs.org/pipermail/patchwork/attachments/20110429/0fad5c35/attachment.pgp>


More information about the Patchwork mailing list