appending fix
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Thu, 13 Oct 2011 08:09:13 +0000 (10:09 +0200)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Thu, 13 Oct 2011 08:13:21 +0000 (10:13 +0200)
apps/catalogue/forms.py
apps/catalogue/models/book.py
apps/catalogue/tests.py
apps/catalogue/views.py

index d1235e8..657a1b0 100644 (file)
@@ -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.
     """
         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(),
     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):
 
 
 class BookForm(forms.ModelForm):
index f4e025e..d60a3b6 100755 (executable)
@@ -130,14 +130,16 @@ class Book(models.Model):
         """
         slugs = set(c.slug for c in self)
         i = 1
         """
         slugs = set(c.slug for c in self)
         i = 1
-        new_slug = proposed
+        new_slug = proposed[:50]
         while new_slug in slugs:
         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."""
             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
         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):
                     # 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:
                     else:
-                        chunk_slug = other.slug
-                    chunk.slug = self.make_chunk_slug(chunk_slug)
+                        chunk.slug = other.slug
                 else:
                 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]
             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
             chunk.slug = self.make_chunk_slug(chunk.slug)
             chunk.save()
             number += 1
+        assert not other.chunk_set.exists()
         other.delete()
 
 
         other.delete()
 
 
index b73ea35..8b21f6d 100755 (executable)
@@ -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'})
         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)
index 487307d..9298116 100644 (file)
@@ -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":
 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:
         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,
     return direct_to_template(request, "catalogue/book_append_to.html", extra_context={
         "book": book,
         "form": form,