From 7f06544ecefd024beb8d1ccf1599322ec9bc2647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Sun, 3 Aug 2014 13:27:20 -0700 Subject: [PATCH] milestone: a milestone can be closed --- issue/migrations/0004_milestone_closed.py | 20 ++++++++++++++ issue/models.py | 2 ++ issue/templates/issue/milestone_list.html | 11 +++++++- issue/urls.py | 2 ++ issue/views.py | 33 ++++++++++++++++++++++- 5 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 issue/migrations/0004_milestone_closed.py diff --git a/issue/migrations/0004_milestone_closed.py b/issue/migrations/0004_milestone_closed.py new file mode 100644 index 0000000..29e1d56 --- /dev/null +++ b/issue/migrations/0004_milestone_closed.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('issue', '0003_auto_20140803_0651'), + ] + + operations = [ + migrations.AddField( + model_name='milestone', + name='closed', + field=models.BooleanField(default=False), + preserve_default=True, + ), + ] diff --git a/issue/models.py b/issue/models.py index babcdb2..4acce90 100644 --- a/issue/models.py +++ b/issue/models.py @@ -78,6 +78,8 @@ class Milestone(models.Model): due_date = models.DateTimeField(blank=True,null=True) + closed = models.BooleanField(default=False) + def closed_issues(self): return self.issues.filter(closed=True).count() diff --git a/issue/templates/issue/milestone_list.html b/issue/templates/issue/milestone_list.html index ff775cb..9058de8 100644 --- a/issue/templates/issue/milestone_list.html +++ b/issue/templates/issue/milestone_list.html @@ -10,6 +10,9 @@

Milestone

@@ -21,6 +24,11 @@
+ {% if milestone.closed %} + + {% else %} + + {% endif %}
@@ -43,7 +51,8 @@ {% else %}
- There aren't any milestones for this repository quite yet. + {{ no_milestone_message }} + There aren't any milestones matching your desired criteria.
{% endif %} diff --git a/issue/urls.py b/issue/urls.py index f99c026..f61ce13 100644 --- a/issue/urls.py +++ b/issue/urls.py @@ -25,6 +25,8 @@ urlpatterns = [ url(r'^(?P[a-z0-9_-]+)/milestones$', 'issue.views.milestone_list', name='list-milestone'), url(r'^(?P[a-z0-9_-]+)/milestones/add$', 'issue.views.milestone_edit', name='add-milestone'), url(r'^(?P[a-z0-9_-]+)/milestones/(?P[a-z0-9_.-]+)/edit$', 'issue.views.milestone_edit', name='edit-milestone'), + url(r'^(?P[a-z0-9_-]+)/milestones/(?P[a-z0-9_.-]+)/close$', 'issue.views.milestone_close', name='close-milestone'), + url(r'^(?P[a-z0-9_-]+)/milestones/(?P[a-z0-9_.-]+)/reopen$', 'issue.views.milestone_reopen', name='reopen-milestone'), url(r'^(?P[a-z0-9_-]+)/milestones/(?P[a-z0-9_.-]+)/delete$', 'issue.views.milestone_delete', name='delete-milestone'), url(r'^login$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}, name='login'), url(r'^logout$', 'django.contrib.auth.views.logout', {'next_page': '/'}, name='logout'), diff --git a/issue/views.py b/issue/views.py index d20413f..c8334dd 100644 --- a/issue/views.py +++ b/issue/views.py @@ -524,10 +524,23 @@ def milestone_list(request, project): project = get_object_or_404(Project, name=project) + show = request.GET.get('show', 'open') + + if show == 'open': + milestones = project.milestones.filter(closed=False) + elif show == 'close': + milestones = project.milestones.filter(closed=True) + elif show == 'all': + milestones = project.milestones.all() + else: + messages.error(request, 'There is an error in your filter.') + milestones = None + c = { 'request': request, 'project': project, - 'milestones': project.milestones.all(), + 'milestones': milestones, + 'show': show, } return render(request, 'issue/milestone_list.html', c) @@ -598,6 +611,24 @@ def milestone_edit(request, project, name=None): return render(request, 'issue/milestone_edit.html', c) +def milestone_close(request, project, name): + + milestone = get_object_or_404(Milestone, project=project, name=name) + + milestone.closed = True + milestone.save() + + return redirect('list-milestone', project) + +def milestone_reopen(request, project, name): + + milestone = get_object_or_404(Milestone, project=project, name=name) + + milestone.closed = False + milestone.save() + + return redirect('list-milestone', project) + def milestone_delete(request, project, name): milestone = get_object_or_404(Milestone, project=project, name=name)