Use todolist slugs for all URLs

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2012-12-28 10:06:32 -06:00
parent 1dc6b867f4
commit 0c94cc4465
4 changed files with 45 additions and 28 deletions

View File

@ -11,11 +11,11 @@ <h2>Todo List: {{ list.name }}</h2>
<ul class="admin-actions">
{% if perms.todolists.delete_todolist %}
<li><a href="/todo/delete/{{list.id}}/"
<li><a href="/todo/{{ list.slug }}/delete/"
title="Delete this todo list">Delete Todo List</a></li>
{% endif %}
{% if perms.todolists.change_todolist %}
<li><a href="/todo/edit/{{list.id}}/"
<li><a href="/todo/{{ list.slug }}/edit/"
title="Edit this todo list">Edit Todo List</a></li>
{% endif %}
</ul>
@ -80,7 +80,7 @@ <h3>Filter Todo List Packages</h3>
<td>{{ pkg.maintainers|join:', ' }}</td>
<td>
{% if perms.todolist.change_todolistpackage %}
<a href="/todo/flag/{{ list.id }}/{{ pkg.id }}/"
<a href="/todo/{{ list.slug }}/flag/{{ pkg.id }}/"
class="status-link {{ pkg.status_css_class }}" title="Toggle completion status">{{ pkg.get_status_display }}</a>
{% else %}
<span class="{{ pkg.status_css_class }}">{{ pkg.get_status_display }}</span>

View File

@ -35,7 +35,7 @@ def __unicode__(self):
return self.name
def get_absolute_url(self):
return '/todo/%i/' % self.old_id
return '/todo/%s/' % self.slug
def get_full_url(self, proto='https'):
'''get a URL suitable for things like email including the domain'''

View File

@ -1,17 +1,26 @@
from django.conf.urls import patterns
from django.contrib.auth.decorators import permission_required
from django.contrib.auth.decorators import login_required, permission_required
from .views import DeleteTodolist
from .views import (view_redirect, view, todolist_list, add, edit, flag,
list_pkgbases, DeleteTodolist)
urlpatterns = patterns('todolists.views',
(r'^$', 'todolist_list'),
(r'^(?P<list_id>\d+)/$', 'view'),
(r'^(?P<list_id>\d+)/pkgbases/(?P<svn_root>[a-z]+)/$', 'list_pkgbases'),
(r'^add/$', 'add'),
(r'^edit/(?P<list_id>\d+)/$', 'edit'),
(r'^flag/(\d+)/(\d+)/$', 'flag'),
(r'^delete/(?P<pk>\d+)/$',
urlpatterns = patterns('',
(r'^$', login_required(todolist_list)),
# old todolists URLs, permanent redirect view so we don't break all links
(r'^(?P<old_id>\d+)/$', view_redirect),
(r'^add/$',
permission_required('todolists.add_todolist')(add)),
(r'^(?P<slug>[-\w]+)/$', login_required(view)),
(r'^(?P<slug>[-\w]+)/edit/$',
permission_required('todolists.change_todolist')(edit)),
(r'^(?P<slug>[-\w]+)/delete/$',
permission_required('todolists.delete_todolist')(DeleteTodolist.as_view())),
(r'^(?P<slug>[-\w]+)/flag/(?P<pkg_id>\d+)/$',
permission_required('todolists.change_todolistpackage')(flag)),
(r'^(?P<slug>[-\w]+)/pkgbases/(?P<svn_root>[a-z]+)/$',
'list_pkgbases'),
)
# vim: set ts=4 sw=4 et:

View File

@ -4,7 +4,6 @@
from django.http import HttpResponse
from django.core.mail import send_mail
from django.shortcuts import get_list_or_404, get_object_or_404, redirect, render
from django.contrib.auth.decorators import login_required, permission_required
from django.db import transaction
from django.views.decorators.cache import never_cache
from django.views.generic import DeleteView
@ -32,10 +31,9 @@ class Meta:
fields = ('name', 'description', 'raw')
@permission_required('todolists.change_todolistpackage')
@never_cache
def flag(request, list_id, pkg_id):
todolist = get_object_or_404(Todolist, old_id=list_id)
def flag(request, slug, pkg_id):
todolist = get_object_or_404(Todolist, slug=slug)
tlpkg = get_object_or_404(TodolistPackage, id=pkg_id)
# TODO: none of this; require absolute value on submit
if tlpkg.status == TodolistPackage.INCOMPLETE:
@ -51,9 +49,14 @@ def flag(request, list_id, pkg_id):
return HttpResponse(json.dumps(data), mimetype='application/json')
return redirect(todolist)
@login_required
def view(request, list_id):
todolist = get_object_or_404(Todolist, old_id=list_id)
def view_redirect(request, old_id):
todolist = get_object_or_404(Todolist, old_id=old_id)
return redirect(todolist, permanent=True)
def view(request, slug):
todolist = get_object_or_404(Todolist, slug=slug)
svn_roots = Repo.objects.values_list(
'svn_root', flat=True).order_by().distinct()
# we don't hold onto the result, but the objects are the same here,
@ -68,22 +71,23 @@ def view(request, list_id):
'repos': sorted(repos),
})
# really no need for login_required on this one...
def list_pkgbases(request, list_id, svn_root):
def list_pkgbases(request, slug, svn_root):
'''Used to make bulk moves of packages a lot easier.'''
todolist = get_object_or_404(Todolist, old_id=list_id)
todolist = get_object_or_404(Todolist, slug=slug)
repos = get_list_or_404(Repo, svn_root=svn_root)
pkgbases = TodolistPackage.objects.values_list('pkgbase', flat=True).filter(
todolist=todolist, repo__in=repos).distinct().order_by('pkgbase')
return HttpResponse('\n'.join(pkgbases),
mimetype='text/plain')
@login_required
def todolist_list(request):
lists = get_annotated_todolists()
return render(request, 'todolists/list.html', {'lists': lists})
@permission_required('todolists.add_todolist')
@never_cache
def add(request):
if request.POST:
@ -103,11 +107,11 @@ def add(request):
}
return render(request, 'general_form.html', page_dict)
# TODO: this calls for transaction management and async emailing
@permission_required('todolists.change_todolist')
@never_cache
def edit(request, list_id):
todo_list = get_object_or_404(Todolist, old_id=list_id)
def edit(request, slug):
todo_list = get_object_or_404(Todolist, slug=slug)
if request.POST:
form = TodoListForm(request.POST, instance=todo_list)
if form.is_valid():
@ -126,12 +130,14 @@ def edit(request, list_id):
}
return render(request, 'general_form.html', page_dict)
class DeleteTodolist(DeleteView):
model = Todolist
# model in main == assumes name 'main/todolist_confirm_delete.html'
template_name = 'todolists/todolist_confirm_delete.html'
success_url = '/todo/'
@transaction.commit_on_success
def create_todolist_packages(form, creator=None):
packages = form.packages()
@ -166,6 +172,7 @@ def create_todolist_packages(form, creator=None):
return todo_pkgs
def send_todolist_emails(todo_list, new_packages):
'''Sends emails to package maintainers notifying them that packages have
been added to a todo list.'''
@ -193,6 +200,7 @@ def send_todolist_emails(todo_list, new_packages):
[maint],
fail_silently=True)
def public_list(request):
todo_lists = Todolist.objects.incomplete()
# total hackjob, but it makes this a lot less query-intensive.