summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--devel/views.py2
-rw-r--r--todolists/models.py8
-rw-r--r--todolists/utils.py1
-rw-r--r--todolists/views.py50
4 files changed, 38 insertions, 23 deletions
diff --git a/devel/views.py b/devel/views.py
index e01590a0..90839847 100644
--- a/devel/views.py
+++ b/devel/views.py
@@ -44,7 +44,7 @@ def index(request):
todopkgs = TodolistPackage.objects.select_related(
'todolist', 'pkg', 'arch', 'repo').exclude(
- status=TodolistPackage.COMPLETE)
+ status=TodolistPackage.COMPLETE).filter(removed__isnull=True)
todopkgs = todopkgs.filter(pkgbase__in=inner_q).order_by(
'todolist__name', 'pkgname')
diff --git a/todolists/models.py b/todolists/models.py
index 156b041d..040f8a29 100644
--- a/todolists/models.py
+++ b/todolists/models.py
@@ -10,8 +10,9 @@ from main.utils import set_created_field
class TodolistManager(models.Manager):
def incomplete(self):
- not_done = (Q(todolistpackage__status=TodolistPackage.INCOMPLETE) |
- Q(todolistpackage__status=TodolistPackage.IN_PROGRESS))
+ not_done = ((Q(todolistpackage__status=TodolistPackage.INCOMPLETE) |
+ Q(todolistpackage__status=TodolistPackage.IN_PROGRESS)) &
+ Q(todolistpackage__removed__isnull=True))
return self.order_by().filter(not_done).distinct()
@@ -44,7 +45,8 @@ class Todolist(models.Model):
def packages(self):
if not hasattr(self, '_packages'):
- self._packages = self.todolistpackage_set.select_related(
+ self._packages = self.todolistpackage_set.filter(
+ removed__isnull=True).select_related(
'pkg', 'repo', 'arch').order_by('pkgname', 'arch')
return self._packages
diff --git a/todolists/utils.py b/todolists/utils.py
index 0daca3b6..e86d9054 100644
--- a/todolists/utils.py
+++ b/todolists/utils.py
@@ -8,6 +8,7 @@ def todo_counts():
sql = """
SELECT todolist_id, count(*), sum(CASE WHEN status = %s THEN 1 ELSE 0 END)
FROM todolists_todolistpackage
+ WHERE removed IS NULL
GROUP BY todolist_id
"""
database = router.db_for_write(TodolistPackage)
diff --git a/todolists/views.py b/todolists/views.py
index 113b27e7..32ee7cc5 100644
--- a/todolists/views.py
+++ b/todolists/views.py
@@ -10,6 +10,7 @@ from django.views.decorators.cache import never_cache
from django.views.generic import DeleteView
from django.template import Context, loader
from django.template.defaultfilters import slugify
+from django.utils.timezone import now
from main.models import Package, Repo
from main.utils import find_unique_slug
@@ -23,10 +24,12 @@ class TodoListForm(forms.ModelForm):
help_text='(one per line)',
widget=forms.Textarea(attrs={'rows': '20', 'cols': '60'}))
+ def package_names(self):
+ return {s.strip() for s in self.cleaned_data['raw'].split("\n")}
+
def packages(self):
- package_names = {s.strip() for s in
- self.cleaned_data['raw'].split("\n")}
- return Package.objects.normal().filter(pkgname__in=package_names,
+ return Package.objects.normal().filter(
+ pkgname__in=self.package_names(),
repo__testing=False, repo__staging=False).order_by('arch')
class Meta:
@@ -37,7 +40,7 @@ class TodoListForm(forms.ModelForm):
@never_cache
def flag(request, slug, pkg_id):
todolist = get_object_or_404(Todolist, slug=slug)
- tlpkg = get_object_or_404(TodolistPackage, id=pkg_id)
+ tlpkg = get_object_or_404(TodolistPackage, id=pkg_id, removed__isnull=True)
# TODO: none of this; require absolute value on submit
if tlpkg.status == TodolistPackage.INCOMPLETE:
tlpkg.status = TodolistPackage.COMPLETE
@@ -75,13 +78,14 @@ def view(request, slug):
})
-# really no need for login_required on this one...
def list_pkgbases(request, slug, svn_root):
'''Used to make bulk moves of packages a lot easier.'''
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')
+ pkgbases = TodolistPackage.objects.values_list(
+ 'pkgbase', flat=True).filter(
+ todolist=todolist, repo__in=repos, removed__isnull=True).order_by(
+ 'pkgbase').distinct()
return HttpResponse('\n'.join(pkgbases),
mimetype='text/plain')
@@ -143,36 +147,44 @@ class DeleteTodolist(DeleteView):
@transaction.commit_on_success
def create_todolist_packages(form, creator=None):
+ package_names = form.package_names()
packages = form.packages()
+ timestamp = now()
if creator:
# todo list is new, populate creator and slug fields
todolist = form.save(commit=False)
todolist.creator = creator
todolist.slug = find_unique_slug(Todolist, todolist.name)
todolist.save()
-
- old_packages = []
else:
# todo list already existed
form.save()
todolist = form.instance
- # first delete any packages not in the new list
+ # first mark removed any packages not in the new list
+ to_remove = set()
for todo_pkg in todolist.packages():
- if todo_pkg.pkg not in packages:
- todo_pkg.delete()
+ if todo_pkg.pkg and todo_pkg.pkg not in packages:
+ to_remove.add(todo_pkg.pk)
+ elif todo_pkg.pkgname not in package_names:
+ to_remove.add(todo_pkg.pk)
- # save the old package list so we know what to add
- old_packages = [todo_pkg.pkg for todo_pkg in todolist.packages()]
+ TodolistPackage.objects.filter(
+ pk__in=to_remove).update(removed=timestamp)
+ # Add (or mark unremoved) any packages in the new packages list
todo_pkgs = []
for package in packages:
- if package not in old_packages:
- todo_pkg = TodolistPackage.objects.create(todolist=todolist,
- pkg=package, pkgname=package.pkgname,
- pkgbase=package.pkgbase,
- arch=package.arch, repo=package.repo)
+ todo_pkg, created = TodolistPackage.objects.get_or_create(
+ todolist=todolist,
+ pkg=package, pkgname=package.pkgname,
+ pkgbase=package.pkgbase,
+ arch=package.arch, repo=package.repo)
+ if created:
todo_pkgs.append(todo_pkg)
+ elif todo_pkg.removed is not None:
+ todo_pkg.removed = None
+ todo_pkg.save()
return todo_pkgs