diff --git a/comic/migrations/0015_auto_20160405_1126.py b/comic/migrations/0015_auto_20160405_1126.py new file mode 100644 index 0000000..af78659 --- /dev/null +++ b/comic/migrations/0015_auto_20160405_1126.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.2 on 2016-04-05 10:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('comic', '0014_auto_20160404_1402'), + ] + + operations = [ + migrations.AlterField( + model_name='comicbook', + name='file_name', + field=models.CharField(max_length=100), + ), + ] diff --git a/comic/models.py b/comic/models.py index d1fd7cf..47c247f 100644 --- a/comic/models.py +++ b/comic/models.py @@ -71,7 +71,7 @@ class Directory(models.Model): class ComicBook(models.Model): - file_name = models.CharField(max_length=100, unique=True) + file_name = models.CharField(max_length=100, unique=False) date_added = models.DateTimeField(auto_now_add=True) directory = models.ForeignKey(Directory, blank=True, null=True) selector = models.UUIDField(unique=True, default=uuid.uuid4, db_index=True) @@ -227,39 +227,6 @@ class ComicBook(models.Model): def __str__(self): return self.name - @staticmethod - def generate_directory(user, base_dir, comic_path): - files = [] - for fn in ComicBook.get_ordered_dir_list(path.join(base_dir, comic_path)): - df = ComicBook.DirFile() - df.name = fn - if path.isdir(path.join(base_dir, comic_path, fn)): - df.isdir = True - df.icon = 'glyphicon-folder-open' - df.location = urlsafe_base64_encode(path.join(comic_path.encode(), fn.encode())) - elif fn.lower()[-4:] in ['.rar', '.zip', '.cbr', '.cbz']: - df.iscb = True - df.icon = 'glyphicon-book' - df.location = urlsafe_base64_encode(path.join(comic_path.encode(), fn.encode())) - try: - book = ComicBook.objects.get(file_name=fn) - status, _ = ComicStatus.objects.get_or_create(comic=book, user=user) - last_page = status.last_read_page - if status.unread: - df.label = 'Unread' - elif (last_page + 1) == book.page_count: - df.label = 'Read' - df.cur_page = last_page - else: - label_text = '%s/%s' % \ - (last_page + 1, book.page_count) - df.label = label_text - df.cur_page = last_page - except ComicBook.DoesNotExist: - df.label = 'Unprocessed' - files.append(df) - return files - @property def pages(self): out = [] diff --git a/comic/tests.py b/comic/tests.py index 6e45b44..d0f19e6 100644 --- a/comic/tests.py +++ b/comic/tests.py @@ -1,25 +1,30 @@ -from django.test import TestCase -from django.contrib.auth.models import User -from django.utils.http import urlsafe_base64_encode -from comic.models import ComicBook, ComicPage, Setting, ComicStatus -from os import path import os +from os import path + +from django.contrib.auth.models import User +from django.test import TestCase +from django.utils.http import urlsafe_base64_encode + +from comic.models import ComicBook, ComicPage, Setting, ComicStatus, Directory +from comic.util import generate_directory + # Create your tests here. + class ComicBookTests(TestCase): def setUp(self): + Setting(name='BASE_DIR', value=path.join(os.getcwd(), 'comic', 'test')).save() user = User(username='test') user.save() - ComicBook.process_comic_book(os.getcwd(), path.join('comic', 'test', 'test1.rar'), 'test1.rar') - book = ComicBook.process_comic_book(os.getcwd(), path.join('comic', 'test', 'test2.rar'), 'test2.rar') + ComicBook.process_comic_book('test1.rar') + book = ComicBook.process_comic_book('test2.rar') status = ComicStatus(user=user, comic=book, last_read_page=2, unread=False) status.save() - ComicBook.process_comic_book(os.getcwd(), path.join('comic', 'test', 'test4.rar'), 'test4.rar') - Setting(name='BASE_DIR', value=os.getcwd()).save() + ComicBook.process_comic_book('test4.rar') def test_comic_processing(self): book = ComicBook.objects.get(file_name='test1.rar') @@ -49,97 +54,95 @@ class ComicBookTests(TestCase): def test_get_image(self): book = ComicBook.objects.get(file_name='test1.rar') - comic_path = path.join(os.getcwd(), 'comic', 'test', 'test1.rar') - img, content_type = book.get_image(comic_path, 0) + img, content_type = book.get_image(0) self.assertEqual(content_type, 'image/jpeg') - self.assertEqual(img.read(), 'img1.jpg') + self.assertEqual(img.read(), b'img1.jpg') def test_nav_first_page_with_folder_above(self): book = ComicBook.objects.get(file_name='test1.rar') - comic_path = path.join('comic', 'test', 'test1.rar') - encoded_path = urlsafe_base64_encode(comic_path) - prev_path_encoded = urlsafe_base64_encode(path.join('comic', 'test')) - nav = book.nav(encoded_path, 0) + user = User.objects.get(username='test') + nav = book.nav(0, user) self.assertEqual(nav.next_index, 1) - self.assertEqual(nav.next_path, encoded_path) + self.assertEqual(nav.next_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.prev_index, -1) - self.assertEqual(nav.prev_path, prev_path_encoded) + self.assertEqual(nav.prev_path, '') self.assertEqual(nav.cur_index, 0) - self.assertEqual(nav.cur_path, encoded_path) + self.assertEqual(nav.cur_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.q_prev_to_directory, True) self.assertEqual(nav.q_next_to_directory, False) def test_nav_first_page_with_comic_above(self): - book = ComicBook.objects.get(file_name='test2.rar') - comic_path = path.join('comic', 'test', 'test2.rar') - encoded_path = urlsafe_base64_encode(comic_path) - prev_path_encoded = urlsafe_base64_encode(path.join('comic', 'test', 'test1.rar')) - nav = book.nav(encoded_path, 0) + prev_book = ComicBook.objects.get(file_name='test1.rar') + book = ComicBook.objects.get(file_name='test2.rar', + directory__isnull=True) + user = User.objects.get(username='test') + + nav = book.nav(0, user) self.assertEqual(nav.next_index, 1) - self.assertEqual(nav.next_path, encoded_path) - self.assertEqual(nav.prev_index, 3) - self.assertEqual(nav.prev_path, prev_path_encoded) + self.assertEqual(nav.next_path, urlsafe_base64_encode(book.selector.bytes)) + self.assertEqual(nav.prev_index, 0) + self.assertEqual(nav.prev_path, urlsafe_base64_encode(prev_book.selector.bytes)) self.assertEqual(nav.cur_index, 0) - self.assertEqual(nav.cur_path, encoded_path) + self.assertEqual(nav.cur_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.q_prev_to_directory, False) self.assertEqual(nav.q_next_to_directory, False) def test_nav_last_page_with_comic_below(self): - book = ComicBook.objects.get(file_name='test2.rar') - comic_path = path.join('comic', 'test', 'test2.rar') - encoded_path = urlsafe_base64_encode(comic_path) - next_path_encoded = urlsafe_base64_encode(path.join('comic', 'test', 'test3.rar')) - nav = book.nav(encoded_path, 3) - self.assertEqual(nav.next_index, 0) - self.assertEqual(nav.next_path, next_path_encoded) + user = User.objects.get(username='test') + book = ComicBook.objects.get(file_name='test1.rar', + directory__isnull=True) + next_book = ComicBook.objects.get(file_name='test2.rar', + directory__isnull=True) + nav = book.nav(3, user) + self.assertEqual(nav.next_index, 2) + self.assertEqual(nav.next_path, urlsafe_base64_encode(next_book.selector.bytes)) self.assertEqual(nav.prev_index, 2) - self.assertEqual(nav.prev_path, encoded_path) + self.assertEqual(nav.prev_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.cur_index, 3) - self.assertEqual(nav.cur_path, encoded_path) + self.assertEqual(nav.cur_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.q_prev_to_directory, False) self.assertEqual(nav.q_next_to_directory, False) def test_nav_last_page_with_nothing_below(self): + user = User.objects.get(username='test') book = ComicBook.objects.get(file_name='test4.rar') - comic_path = path.join('comic', 'test', 'test4.rar') - encoded_path = urlsafe_base64_encode(comic_path) - next_path_encoded = urlsafe_base64_encode(path.join('comic', 'test')) - nav = book.nav(encoded_path, 3) + nav = book.nav(3, user) self.assertEqual(nav.next_index, -1) - self.assertEqual(nav.next_path, next_path_encoded) + self.assertEqual(nav.next_path, '') self.assertEqual(nav.prev_index, 2) - self.assertEqual(nav.prev_path, encoded_path) + self.assertEqual(nav.prev_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.cur_index, 3) - self.assertEqual(nav.cur_path, encoded_path) + self.assertEqual(nav.cur_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.q_prev_to_directory, False) self.assertEqual(nav.q_next_to_directory, True) def test_nav_in_comic(self): - book = ComicBook.objects.get(file_name='test1.rar') - comic_path = path.join('comic', 'test', 'test1.rar') - encoded_path = urlsafe_base64_encode(comic_path) - nav = book.nav(encoded_path, 1) + user = User.objects.get(username='test') + book = ComicBook.objects.get(file_name='test1.rar', + directory__isnull=True) + nav = book.nav(1, user) self.assertEqual(nav.next_index, 2) - self.assertEqual(nav.next_path, encoded_path) + self.assertEqual(nav.next_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.prev_index, 0) - self.assertEqual(nav.prev_path, encoded_path) + self.assertEqual(nav.prev_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.cur_index, 1) - self.assertEqual(nav.cur_path, encoded_path) + self.assertEqual(nav.cur_path, urlsafe_base64_encode(book.selector.bytes)) self.assertEqual(nav.q_prev_to_directory, False) self.assertEqual(nav.q_next_to_directory, False) def test_generate_directory(self): - base_dir = Setting.objects.get(name='BASE_DIR').value user = User.objects.get(username='test') - folders = ComicBook.generate_directory(user, base_dir, path.join('comic', 'test')) + folders = generate_directory(user) dir1 = folders[0] self.assertEqual(dir1.name, 'test_folder') self.assertTrue(dir1.isdir) self.assertEqual(dir1.icon, 'glyphicon-folder-open') self.assertFalse(dir1.iscb) - location = urlsafe_base64_encode(path.join('comic', 'test', 'test_folder')) + d = Directory.objects.get(name='test_folder', + parent__isnull=True) + location = '/comic/{0}/'.format(urlsafe_base64_encode(d.selector.bytes).decode()) self.assertEqual(dir1.location, location) - self.assertEqual(dir1.label, '') + self.assertEqual(dir1.label, '
Empty
') self.assertEqual(dir1.cur_page, 0) dir2 = folders[1] @@ -147,9 +150,12 @@ class ComicBookTests(TestCase): self.assertFalse(dir2.isdir) self.assertEqual(dir2.icon, 'glyphicon-book') self.assertTrue(dir2.iscb) - location = urlsafe_base64_encode(path.join('comic', 'test', 'test1.rar')) + c = ComicBook.objects.get(file_name='test1.rar', + directory__isnull=True) + location = '/comic/read/{0}/{1}/'.format(urlsafe_base64_encode(c.selector.bytes).decode(), + '0') self.assertEqual(dir2.location, location) - self.assertEqual(dir2.label, 'Unread') + self.assertEqual(dir2.label, '
Unread
') self.assertEqual(dir2.cur_page, 0) dir3 = folders[2] @@ -157,9 +163,12 @@ class ComicBookTests(TestCase): self.assertFalse(dir3.isdir) self.assertEqual(dir3.icon, 'glyphicon-book') self.assertTrue(dir3.iscb) - location = urlsafe_base64_encode(path.join('comic', 'test', 'test2.rar')) + c = ComicBook.objects.get(file_name='test2.rar', + directory__isnull=True) + location = '/comic/read/{0}/{1}/'.format(urlsafe_base64_encode(c.selector.bytes).decode(), + '2') self.assertEqual(dir3.location, location) - self.assertEqual(dir3.label, '3/4') + self.assertEqual(dir3.label, '
3/4
') self.assertEqual(dir3.cur_page, 2) dir3 = folders[3] @@ -167,9 +176,12 @@ class ComicBookTests(TestCase): self.assertFalse(dir3.isdir) self.assertEqual(dir3.icon, 'glyphicon-book') self.assertTrue(dir3.iscb) - location = urlsafe_base64_encode(path.join('comic', 'test', 'test3.rar')) + c = ComicBook.objects.get(file_name='test3.rar', + directory__isnull=True) + location = '/comic/read/{0}/{1}/'.format(urlsafe_base64_encode(c.selector.bytes).decode(), + '0') self.assertEqual(dir3.location, location) - self.assertEqual(dir3.label, 'Unprocessed') + self.assertEqual(dir3.label, '
Unread
') self.assertEqual(dir3.cur_page, 0) def test_pages(self): @@ -187,41 +199,3 @@ class ComicBookTests(TestCase): def test_page_name(self): book = ComicBook.objects.get(file_name='test1.rar') self.assertEqual(book.page_name(0), 'img1.jpg') - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/comic/util.py b/comic/util.py index fbc5951..8e3b9c6 100644 --- a/comic/util.py +++ b/comic/util.py @@ -107,12 +107,20 @@ def generate_directory(user, directory=False): df = DirFile() df.name = file_name if path.isdir(path.join(base_dir, dir_path, file_name)): - if directory: - d = Directory.objects.get(name=file_name, - parent=directory) - else: - d = Directory.objects.get(name=file_name, - parent__isnull=True) + try: + if directory: + d = Directory.objects.get(name=file_name, + parent=directory) + else: + d = Directory.objects.get(name=file_name, + parent__isnull=True) + except Directory.DoesNotExist: + if directory: + d = Directory(name=file_name, + parent=directory) + else: + d = Directory(name=file_name) + d.save() df.isdir = True df.icon = 'glyphicon-folder-open' df.location = '/comic/{0}/'.format(urlsafe_base64_encode(d.selector.bytes).decode()) diff --git a/comic/views.py b/comic/views.py index dbab374..e7ff27a 100644 --- a/comic/views.py +++ b/comic/views.py @@ -232,7 +232,6 @@ def settings_page(request): @login_required def read_comic(request, comic_selector, page): - base_dir = Setting.objects.get(name='BASE_DIR').value page = int(page) selector = uuid.UUID(bytes=urlsafe_base64_decode(comic_selector)) book = get_object_or_404(ComicBook, selector=selector) diff --git a/manage.py b/manage.py index d2ef3ea..eab41c7 100644 --- a/manage.py +++ b/manage.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import os import sys