From 4b3016bf455bd8faca4209acf3c4b4fa361e4c85 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Thu, 13 Oct 2011 10:09:13 +0200 Subject: [PATCH 1/1] appending fix --- apps/catalogue/forms.py | 8 ++++++-- apps/catalogue/models/book.py | 14 ++++++++------ apps/catalogue/tests.py | 19 +++++++++++++++++++ apps/catalogue/views.py | 4 ++-- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/apps/catalogue/forms.py b/apps/catalogue/forms.py index d1235e85..657a1b04 100644 --- a/apps/catalogue/forms.py +++ b/apps/catalogue/forms.py @@ -104,9 +104,13 @@ class BookAppendForm(forms.Form): Form for appending a book to another book. It means moving all chunks from book A to book B and deleting A. """ - append_to = forms.ModelChoiceField(queryset=Book.objects.all(), - label=_("Append to")) + label=_("Append to")) + + def __init__(self, book, *args, **kwargs): + ret = super(BookAppendForm, self).__init__(*args, **kwargs) + self.fields['append_to'].queryset = Book.objects.exclude(pk=book.pk) + return ret class BookForm(forms.ModelForm): diff --git a/apps/catalogue/models/book.py b/apps/catalogue/models/book.py index f4e025ed..d60a3b67 100755 --- a/apps/catalogue/models/book.py +++ b/apps/catalogue/models/book.py @@ -130,14 +130,16 @@ class Book(models.Model): """ slugs = set(c.slug for c in self) i = 1 - new_slug = proposed + new_slug = proposed[:50] while new_slug in slugs: - new_slug = "%s_%d" % (proposed, i) + new_slug = "%s_%d" % (proposed[:45], i) i += 1 return new_slug def append(self, other, slugs=None, titles=None): """Add all chunks of another book to self.""" + assert self != other + number = self[len(self) - 1].number + 1 len_other = len(other) single = len_other == 1 @@ -166,12 +168,11 @@ class Book(models.Model): # just use the guessed title and original book slug chunk.title = other_title_part if other.slug.startswith(self.slug): - chunk_slug = other.slug[len(self.slug):].lstrip('-_') + chunk.slug = other.slug[len(self.slug):].lstrip('-_') else: - chunk_slug = other.slug - chunk.slug = self.make_chunk_slug(chunk_slug) + chunk.slug = other.slug else: - chunk.title = "%s, %s" % (other_title_part, chunk.title) + chunk.title = ("%s, %s" % (other_title_part, chunk.title))[:255] else: chunk.slug = slugs[i] chunk.title = titles[i] @@ -179,6 +180,7 @@ class Book(models.Model): chunk.slug = self.make_chunk_slug(chunk.slug) chunk.save() number += 1 + assert not other.chunk_set.exists() other.delete() diff --git a/apps/catalogue/tests.py b/apps/catalogue/tests.py index b73ea353..8b21f6d9 100755 --- a/apps/catalogue/tests.py +++ b/apps/catalogue/tests.py @@ -29,3 +29,22 @@ class PublishTests(TestCase): self.book[1].head.set_publishable(True) self.book.publish(self.user) api_call.assert_called_with(self.user, 'books', {"book_xml": 'publish me\n too'}) + + +class ManipulationTests(TestCase): + + def setUp(self): + self.user = User.objects.create(username='tester') + self.book1 = Book.create(self.user, 'book 1') + self.book2 = Book.create(self.user, 'book 2') + + def test_append(self): + self.book1.append(self.book2) + self.assertEqual(Book.objects.all().count(), 1) + self.assertEqual(len(self.book1), 2) + + def test_append_to_self(self): + with self.assertRaises(AssertionError): + self.book1.append(Book.objects.get(pk=self.book1.pk)) + self.assertEqual(Book.objects.all().count(), 2) + self.assertEqual(len(self.book1), 1) diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index 487307d5..9298116e 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -368,13 +368,13 @@ def chunk_edit(request, slug, chunk): def book_append(request, slug): book = get_object_or_404(Book, slug=slug) if request.method == "POST": - form = forms.BookAppendForm(request.POST) + form = forms.BookAppendForm(book, request.POST) if form.is_valid(): append_to = form.cleaned_data['append_to'] append_to.append(book) return http.HttpResponseRedirect(append_to.get_absolute_url()) else: - form = forms.BookAppendForm() + form = forms.BookAppendForm(book) return direct_to_template(request, "catalogue/book_append_to.html", extra_context={ "book": book, "form": form, -- 2.20.1