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):
"""
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
# 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]
chunk.slug = self.make_chunk_slug(chunk.slug)
chunk.save()
number += 1
+ assert not other.chunk_set.exists()
other.delete()
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)
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,