Skip to content

Commit

Permalink
possibility to archive projects
Browse files Browse the repository at this point in the history
  • Loading branch information
bouttier committed Apr 17, 2016
1 parent d14861a commit 63579ec
Show file tree
Hide file tree
Showing 9 changed files with 101 additions and 19 deletions.
23 changes: 13 additions & 10 deletions ponytracker/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -43,26 +43,29 @@
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
{% if projects.exists %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{% block project %}Project <span class="caret"></span>{% endblock %}</a>
{% if projects.exists %}
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{% block project %}<em>Project</em> <span class="caret"></span>{% endblock %}</a>
{% else %}
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><em>No project</em> <span class="caret"></span></a>
{% endif %}
<ul class="dropdown-menu" role="menu">
{% for project in projects %}
<li role="presentation"><a role="menuitem" tabindex="-1" href="{% url 'list-issue' project.name %}">{{ project }}</a></li>
{% endfor %}
{% if perm.create_project %}
{% if projects.exists %}
<li class="divider"></li>
{% endif %}
{% if archived %}
<li role="presentation"><a role="menuitem" tabindex="-1" href="{% url 'list-project' %}"><span class="glyphicon glyphicon-list"></span> Active projects</a></li>
{% else %}
<li role="presentation"><a role="menuitem" tabindex="-1" href="{% url 'list-archived-project' %}"><span class="glyphicon glyphicon-list"></span> Archived projects</a></li>
{% endif %}
{% if perm.create_project %}
<li role="presentation"><a role="menuitem" tabindex="-1" href="{% url 'add-project' %}"><span class="glyphicon glyphicon-plus"></span> New project…</a></li>
{% endif %}
</ul>
</li>
{% else %}
{% if perm.create_project %}
<li role="presentation"><a role="menuitem" tabindex="-1" href="{% url 'add-project' %}">Create new project</a></li>
{% else %}
<li role="presentation"><a role="munitem" tabindex="-1" href="#"><em>No project</em></a></li>
{% endif %}
{% endif %}
{% block navbar-left %}{% endblock %}
</ul>
<ul class="nav navbar-nav navbar-right">
Expand Down
10 changes: 7 additions & 3 deletions tracker/context_processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@

def projects(request):

c = {}

if hasattr(request, 'archived'):
c['archived'] = request.archived
if hasattr(request, 'projects'):
return {'projects': request.projects}
else:
return {}
c['projects'] = request.projects

return c
14 changes: 12 additions & 2 deletions tracker/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,15 @@ def process_view(self, request, view, view_args, view_kwargs):
" 'django.contrib.auth.middleware.AuthenticationMiddleware'"
" before the ProjectMiddleware class.")

request.projects = granted_projects(request.user)
all_projects = granted_projects(request.user)

# filtering archived / not archived projects
if 'archived' in view_kwargs:
request.archived = view_kwargs['archived']
request.projects = all_projects.filter(archived=request.archived)
else:
request.archived = False
request.projects = all_projects.filter(archived=request.archived)

# project
if view.__module__ not in modules:
Expand All @@ -34,11 +42,13 @@ def process_view(self, request, view, view_args, view_kwargs):
if not project:
return
try:
project = request.projects.get(name=project)
project = all_projects.get(name=project)
except ObjectDoesNotExist:
if request.user.is_authenticated():
raise PermissionDenied()
else:
return login_required(view)(request, *view_args, **view_kwargs)
view_kwargs['project'] = project
request.project = project
request.archived = project.archived
request.projects = all_projects.filter(archived=request.archived)
19 changes: 19 additions & 0 deletions tracker/migrations/0009_project_archived.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('tracker', '0008_auto_20160109_1419'),
]

operations = [
migrations.AddField(
model_name='project',
name='archived',
field=models.BooleanField(default=False),
),
]
2 changes: 2 additions & 0 deletions tracker/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ class Meta:
subscribers = models.ManyToManyField(User, blank=True,
related_name='subscribed_projects')

archived = models.BooleanField(default=False)

@property
def labels(self):
return Label.objects.filter(project=self, deleted=False)
Expand Down
5 changes: 5 additions & 0 deletions tracker/templates/tracker/project_base.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@
{% endif %}
{% if perm.modify_project %}
<li role="presentation"><a role="menuitem" tabindex="-1" href="{% url 'edit-project' project.name %}"><span class="glyphicon glyphicon-wrench"></span> Modify this project</a></li>
{% if project.archived %}
<li role="presentation"><a role="menuitem" tabindex="-1" href="{% url 'unarchive-project' project.name %}"><span class="glyphicon glyphicon-folder-open"></span> Un-archive this project</a></li>
{% else %}
<li role="presentation"><a role="menuitem" tabindex="-1" href="{% url 'archive-project' project.name %}"><span class="glyphicon glyphicon-folder-close"></span> Archive this project</a></li>
{% endif %}
{% endif %}
{% if perm.delete_project %}
<li role="presentation"><a role="menuitem" tabindex="-1" href="#" data-item="project" data-action="{% url 'delete-project' project.name %}" data-toggle="modal" data-target="#confirm-delete"><span class="glyphicon glyphicon-trash"></span> Delete this project</a></li>
Expand Down
16 changes: 16 additions & 0 deletions tracker/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,22 @@ def test_project_subscribe_unsubscribe(self):
response = self.client.get(reverse('unsubscribe-project', args=[project.name])+'?next='+reverse('profile'))
self.assertRedirects(response, reverse('profile'))

def test_achive(self):
project = Project.objects.get(name='project-1')
self.assertFalse(project.archived)
response = self.client.get(reverse('unarchive-project', args=['project-1']))
self.assertEqual(response.status_code, 404)
response = self.client.get(reverse('archive-project', args=['project-1']))
self.assertRedirects(response, reverse('list-issue', args=['project-1']))
project = Project.objects.get(name='project-1')
self.assertTrue(project.archived)
response = self.client.get(reverse('archive-project', args=['project-1']))
self.assertEqual(response.status_code, 404)
response = self.client.get(reverse('unarchive-project', args=['project-1']))
self.assertRedirects(response, reverse('list-issue', args=['project-1']))
project = Project.objects.get(name='project-1')
self.assertFalse(project.archived)

# Issue

def test_issue_list(self):
Expand Down
3 changes: 3 additions & 0 deletions tracker/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,14 @@
url(r'^admin/settings/$', 'tracker.views.settings_list', name='settings'),
# Projects
url(r'^$', 'tracker.views.project_list', name='list-project'),
url(r'^archived/$', 'tracker.views.project_list', {'archived': True}, name='list-archived-project'),
url(r'^add/$', 'tracker.views.project_add', name='add-project'),
url(r'^(?P<project>[-\w]+)/edit/$', 'tracker.views.project_edit', name='edit-project'),
url(r'^(?P<project>[-\w]+)/delete/$', 'tracker.views.project_delete', name='delete-project'),
url(r'^(?P<project>[-\w]+)/subscribe/$', 'tracker.views.project_subscribe', name='subscribe-project'),
url(r'^(?P<project>[-\w]+)/unsubscribe/$', 'tracker.views.project_unsubscribe', name='unsubscribe-project'),
url(r'^(?P<project>[-\w]+)/archive/$', 'tracker.views.project_archive', {'archive': True}, name='archive-project'),
url(r'^(?P<project>[-\w]+)/unarchive/$', 'tracker.views.project_archive', {'archive': False}, name='unarchive-project'),
# Issues
url(r'^(?P<project>[-\w]+)/issues/$', 'tracker.views.issue_list', name='list-issue'),
url(r'^(?P<project>[-\w]+)/issues/add/$', 'tracker.views.issue_edit', name='add-issue'),
Expand Down
28 changes: 24 additions & 4 deletions tracker/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from django.conf import settings
from django.core.urlresolvers import reverse
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.http import HttpResponse
from django.http import HttpResponse, Http404
from django.db.models import Max, Count

from tracker.utils import markdown_to_html, IssueManager
Expand Down Expand Up @@ -74,15 +74,19 @@ def settings_list(request):
# Projects #
############

def project_list(request):
def project_list(request, archived=False):

if not request.projects.exists():
if not archived and not request.projects.exists():

if request.user.has_perm('create_project'):
messages.info(request, 'Start by creating a project.')
return redirect('add-project')

return render(request, 'tracker/project_list.html')
c = {
'archived': archived,
}

return render(request, 'tracker/project_list.html', c)


def project_redirect(request, project):
Expand Down Expand Up @@ -206,6 +210,22 @@ def project_unsubscribe(request, project):
return redirect('list-issue', project.name)


@project_perm_required('modify_project')
def project_archive(request, project, archive):

if project.archived == archive:
raise Http404()

project.archived = archive
project.save()
if archive:
messages.success(request, 'Project archived.')
else:
messages.success(request, 'Project un-archived.')

return redirect('list-issue', project.name)


##########
# Issues #
##########
Expand Down

0 comments on commit 63579ec

Please sign in to comment.