milestone: a milestone can be closed
This commit is contained in:
parent
2f9fdf4a4f
commit
7f06544ece
5 changed files with 66 additions and 2 deletions
20
issue/migrations/0004_milestone_closed.py
Normal file
20
issue/migrations/0004_milestone_closed.py
Normal 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,
|
||||||
|
),
|
||||||
|
]
|
|
@ -78,6 +78,8 @@ class Milestone(models.Model):
|
||||||
|
|
||||||
due_date = models.DateTimeField(blank=True,null=True)
|
due_date = models.DateTimeField(blank=True,null=True)
|
||||||
|
|
||||||
|
closed = models.BooleanField(default=False)
|
||||||
|
|
||||||
def closed_issues(self):
|
def closed_issues(self):
|
||||||
|
|
||||||
return self.issues.filter(closed=True).count()
|
return self.issues.filter(closed=True).count()
|
||||||
|
|
|
@ -10,6 +10,9 @@
|
||||||
<h1>
|
<h1>
|
||||||
Milestone
|
Milestone
|
||||||
<div class="pull-right">
|
<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>
|
<a href="{% url 'add-milestone' project.name %}"><button class="btn btn-success">New milestone</button></a>
|
||||||
</div>
|
</div>
|
||||||
</h1>
|
</h1>
|
||||||
|
@ -21,6 +24,11 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<div class="pull-right">
|
<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 '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>
|
<a href="{% url 'delete-milestone' project.name milestone.name %}"><button class="btn btn-danger"><span class="glyphicon glyphicon-remove"></span> Delete</button></a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -43,7 +51,8 @@
|
||||||
</table>
|
</table>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="panel-body">
|
<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>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
|
@ -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$', '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/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_.-]+)/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'^(?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'^login$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}, name='login'),
|
||||||
url(r'^logout$', 'django.contrib.auth.views.logout', {'next_page': '/'}, name='logout'),
|
url(r'^logout$', 'django.contrib.auth.views.logout', {'next_page': '/'}, name='logout'),
|
||||||
|
|
|
@ -524,10 +524,23 @@ def milestone_list(request, project):
|
||||||
|
|
||||||
project = get_object_or_404(Project, name=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 = {
|
c = {
|
||||||
'request': request,
|
'request': request,
|
||||||
'project': project,
|
'project': project,
|
||||||
'milestones': project.milestones.all(),
|
'milestones': milestones,
|
||||||
|
'show': show,
|
||||||
}
|
}
|
||||||
|
|
||||||
return render(request, 'issue/milestone_list.html', c)
|
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)
|
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):
|
def milestone_delete(request, project, name):
|
||||||
|
|
||||||
milestone = get_object_or_404(Milestone, project=project, name=name)
|
milestone = get_object_or_404(Milestone, project=project, name=name)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue