milestone: a milestone can be closed

This commit is contained in:
Élie Bouttier 2014-08-03 13:27:20 -07:00
parent 2f9fdf4a4f
commit 7f06544ece
5 changed files with 66 additions and 2 deletions

View file

@ -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,
),
]

View file

@ -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()

View file

@ -10,6 +10,9 @@
<h1>
Milestone
<div class="pull-right">
<a href="{% url 'list-milestone' project.name %}?show=open"><button class="btn btn-default btn-sm{% if show == 'open' %} active{% endif %}">Open</button></a>
<a href="{% url 'list-milestone' project.name %}?show=close"><button class="btn btn-default btn-sm{% if show == 'close' %} active{% endif %}">Close</button></a>
<a href="{% url 'list-milestone' project.name %}?show=all"><button class="btn btn-default btn-sm{% if show == 'all' %} active{% endif %}">All</button></a>
<a href="{% url 'add-milestone' project.name %}"><button class="btn btn-success">New milestone</button></a>
</div>
</h1>
@ -21,6 +24,11 @@
<tr>
<td>
<div class="pull-right">
{% if milestone.closed %}
<a href="{% url 'reopen-milestone' project.name milestone.name %}"><button class="btn btn-info"><span class="glyphicon glyphicon-repeat"></span> Reopen</button></a>
{% else %}
<a href="{% url 'close-milestone' project.name milestone.name %}"><button class="btn btn-info"><span class="glyphicon glyphicon-ok-circle"></span> Close</button></a>
{% endif %}
<a href="{% url 'edit-milestone' project.name milestone.name %}"><button class="btn btn-primary"><span class="glyphicon glyphicon-edit"></span> Edit</button></a>
<a href="{% url 'delete-milestone' project.name milestone.name %}"><button class="btn btn-danger"><span class="glyphicon glyphicon-remove"></span> Delete</button></a>
</div>
@ -43,7 +51,8 @@
</table>
{% else %}
<div class="panel-body">
There aren't any milestones for this repository quite yet.
{{ no_milestone_message }}
There aren't any milestones matching your desired criteria.
</div>
{% endif %}

View file

@ -25,6 +25,8 @@ urlpatterns = [
url(r'^(?P<project>[a-z0-9_-]+)/milestones$', 'issue.views.milestone_list', name='list-milestone'),
url(r'^(?P<project>[a-z0-9_-]+)/milestones/add$', 'issue.views.milestone_edit', name='add-milestone'),
url(r'^(?P<project>[a-z0-9_-]+)/milestones/(?P<name>[a-z0-9_.-]+)/edit$', 'issue.views.milestone_edit', name='edit-milestone'),
url(r'^(?P<project>[a-z0-9_-]+)/milestones/(?P<name>[a-z0-9_.-]+)/close$', 'issue.views.milestone_close', name='close-milestone'),
url(r'^(?P<project>[a-z0-9_-]+)/milestones/(?P<name>[a-z0-9_.-]+)/reopen$', 'issue.views.milestone_reopen', name='reopen-milestone'),
url(r'^(?P<project>[a-z0-9_-]+)/milestones/(?P<name>[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'),

View file

@ -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)