misc fixes. also fixed tests.

This commit is contained in:
ajurna@gmail.com
2016-04-05 14:34:41 +01:00
parent dd38e4c3f1
commit 9235380328
6 changed files with 109 additions and 141 deletions

View File

@@ -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),
),
]

View File

@@ -71,7 +71,7 @@ class Directory(models.Model):
class ComicBook(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) date_added = models.DateTimeField(auto_now_add=True)
directory = models.ForeignKey(Directory, blank=True, null=True) directory = models.ForeignKey(Directory, blank=True, null=True)
selector = models.UUIDField(unique=True, default=uuid.uuid4, db_index=True) selector = models.UUIDField(unique=True, default=uuid.uuid4, db_index=True)
@@ -227,39 +227,6 @@ class ComicBook(models.Model):
def __str__(self): def __str__(self):
return self.name 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 = '<span class="label label-default pull-right">Unread</span>'
elif (last_page + 1) == book.page_count:
df.label = '<span class="label label-success pull-right">Read</span>'
df.cur_page = last_page
else:
label_text = '<span class="label label-primary pull-right">%s/%s</span>' % \
(last_page + 1, book.page_count)
df.label = label_text
df.cur_page = last_page
except ComicBook.DoesNotExist:
df.label = '<span class="label label-danger pull-right">Unprocessed</span>'
files.append(df)
return files
@property @property
def pages(self): def pages(self):
out = [] out = []

View File

@@ -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 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. # Create your tests here.
class ComicBookTests(TestCase): class ComicBookTests(TestCase):
def setUp(self): def setUp(self):
Setting(name='BASE_DIR', value=path.join(os.getcwd(), 'comic', 'test')).save()
user = User(username='test') user = User(username='test')
user.save() user.save()
ComicBook.process_comic_book(os.getcwd(), path.join('comic', 'test', 'test1.rar'), 'test1.rar') ComicBook.process_comic_book('test1.rar')
book = ComicBook.process_comic_book(os.getcwd(), path.join('comic', 'test', 'test2.rar'), 'test2.rar') book = ComicBook.process_comic_book('test2.rar')
status = ComicStatus(user=user, status = ComicStatus(user=user,
comic=book, comic=book,
last_read_page=2, last_read_page=2,
unread=False) unread=False)
status.save() status.save()
ComicBook.process_comic_book(os.getcwd(), path.join('comic', 'test', 'test4.rar'), 'test4.rar') ComicBook.process_comic_book('test4.rar')
Setting(name='BASE_DIR', value=os.getcwd()).save()
def test_comic_processing(self): def test_comic_processing(self):
book = ComicBook.objects.get(file_name='test1.rar') book = ComicBook.objects.get(file_name='test1.rar')
@@ -49,97 +54,95 @@ class ComicBookTests(TestCase):
def test_get_image(self): def test_get_image(self):
book = ComicBook.objects.get(file_name='test1.rar') book = ComicBook.objects.get(file_name='test1.rar')
comic_path = path.join(os.getcwd(), 'comic', 'test', 'test1.rar') img, content_type = book.get_image(0)
img, content_type = book.get_image(comic_path, 0)
self.assertEqual(content_type, 'image/jpeg') 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): def test_nav_first_page_with_folder_above(self):
book = ComicBook.objects.get(file_name='test1.rar') book = ComicBook.objects.get(file_name='test1.rar')
comic_path = path.join('comic', 'test', 'test1.rar') user = User.objects.get(username='test')
encoded_path = urlsafe_base64_encode(comic_path) nav = book.nav(0, user)
prev_path_encoded = urlsafe_base64_encode(path.join('comic', 'test'))
nav = book.nav(encoded_path, 0)
self.assertEqual(nav.next_index, 1) 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_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_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_prev_to_directory, True)
self.assertEqual(nav.q_next_to_directory, False) self.assertEqual(nav.q_next_to_directory, False)
def test_nav_first_page_with_comic_above(self): def test_nav_first_page_with_comic_above(self):
book = ComicBook.objects.get(file_name='test2.rar') prev_book = ComicBook.objects.get(file_name='test1.rar')
comic_path = path.join('comic', 'test', 'test2.rar') book = ComicBook.objects.get(file_name='test2.rar',
encoded_path = urlsafe_base64_encode(comic_path) directory__isnull=True)
prev_path_encoded = urlsafe_base64_encode(path.join('comic', 'test', 'test1.rar')) user = User.objects.get(username='test')
nav = book.nav(encoded_path, 0)
nav = book.nav(0, user)
self.assertEqual(nav.next_index, 1) 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, 3) self.assertEqual(nav.prev_index, 0)
self.assertEqual(nav.prev_path, prev_path_encoded) self.assertEqual(nav.prev_path, urlsafe_base64_encode(prev_book.selector.bytes))
self.assertEqual(nav.cur_index, 0) 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_prev_to_directory, False)
self.assertEqual(nav.q_next_to_directory, False) self.assertEqual(nav.q_next_to_directory, False)
def test_nav_last_page_with_comic_below(self): def test_nav_last_page_with_comic_below(self):
book = ComicBook.objects.get(file_name='test2.rar') user = User.objects.get(username='test')
comic_path = path.join('comic', 'test', 'test2.rar') book = ComicBook.objects.get(file_name='test1.rar',
encoded_path = urlsafe_base64_encode(comic_path) directory__isnull=True)
next_path_encoded = urlsafe_base64_encode(path.join('comic', 'test', 'test3.rar')) next_book = ComicBook.objects.get(file_name='test2.rar',
nav = book.nav(encoded_path, 3) directory__isnull=True)
self.assertEqual(nav.next_index, 0) nav = book.nav(3, user)
self.assertEqual(nav.next_path, next_path_encoded) 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_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_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_prev_to_directory, False)
self.assertEqual(nav.q_next_to_directory, False) self.assertEqual(nav.q_next_to_directory, False)
def test_nav_last_page_with_nothing_below(self): def test_nav_last_page_with_nothing_below(self):
user = User.objects.get(username='test')
book = ComicBook.objects.get(file_name='test4.rar') book = ComicBook.objects.get(file_name='test4.rar')
comic_path = path.join('comic', 'test', 'test4.rar') nav = book.nav(3, user)
encoded_path = urlsafe_base64_encode(comic_path)
next_path_encoded = urlsafe_base64_encode(path.join('comic', 'test'))
nav = book.nav(encoded_path, 3)
self.assertEqual(nav.next_index, -1) 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_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_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_prev_to_directory, False)
self.assertEqual(nav.q_next_to_directory, True) self.assertEqual(nav.q_next_to_directory, True)
def test_nav_in_comic(self): def test_nav_in_comic(self):
book = ComicBook.objects.get(file_name='test1.rar') user = User.objects.get(username='test')
comic_path = path.join('comic', 'test', 'test1.rar') book = ComicBook.objects.get(file_name='test1.rar',
encoded_path = urlsafe_base64_encode(comic_path) directory__isnull=True)
nav = book.nav(encoded_path, 1) nav = book.nav(1, user)
self.assertEqual(nav.next_index, 2) 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_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_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_prev_to_directory, False)
self.assertEqual(nav.q_next_to_directory, False) self.assertEqual(nav.q_next_to_directory, False)
def test_generate_directory(self): def test_generate_directory(self):
base_dir = Setting.objects.get(name='BASE_DIR').value
user = User.objects.get(username='test') user = User.objects.get(username='test')
folders = ComicBook.generate_directory(user, base_dir, path.join('comic', 'test')) folders = generate_directory(user)
dir1 = folders[0] dir1 = folders[0]
self.assertEqual(dir1.name, 'test_folder') self.assertEqual(dir1.name, 'test_folder')
self.assertTrue(dir1.isdir) self.assertTrue(dir1.isdir)
self.assertEqual(dir1.icon, 'glyphicon-folder-open') self.assertEqual(dir1.icon, 'glyphicon-folder-open')
self.assertFalse(dir1.iscb) 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.location, location)
self.assertEqual(dir1.label, '') self.assertEqual(dir1.label, '<center><span class="label label-default">Empty</span></center>')
self.assertEqual(dir1.cur_page, 0) self.assertEqual(dir1.cur_page, 0)
dir2 = folders[1] dir2 = folders[1]
@@ -147,9 +150,12 @@ class ComicBookTests(TestCase):
self.assertFalse(dir2.isdir) self.assertFalse(dir2.isdir)
self.assertEqual(dir2.icon, 'glyphicon-book') self.assertEqual(dir2.icon, 'glyphicon-book')
self.assertTrue(dir2.iscb) 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.location, location)
self.assertEqual(dir2.label, '<span class="label label-default pull-right">Unread</span>') self.assertEqual(dir2.label, '<center><span class="label label-default">Unread</span></center>')
self.assertEqual(dir2.cur_page, 0) self.assertEqual(dir2.cur_page, 0)
dir3 = folders[2] dir3 = folders[2]
@@ -157,9 +163,12 @@ class ComicBookTests(TestCase):
self.assertFalse(dir3.isdir) self.assertFalse(dir3.isdir)
self.assertEqual(dir3.icon, 'glyphicon-book') self.assertEqual(dir3.icon, 'glyphicon-book')
self.assertTrue(dir3.iscb) 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.location, location)
self.assertEqual(dir3.label, '<span class="label label-primary pull-right">3/4</span>') self.assertEqual(dir3.label, '<center><span class="label label-primary">3/4</span></center>')
self.assertEqual(dir3.cur_page, 2) self.assertEqual(dir3.cur_page, 2)
dir3 = folders[3] dir3 = folders[3]
@@ -167,9 +176,12 @@ class ComicBookTests(TestCase):
self.assertFalse(dir3.isdir) self.assertFalse(dir3.isdir)
self.assertEqual(dir3.icon, 'glyphicon-book') self.assertEqual(dir3.icon, 'glyphicon-book')
self.assertTrue(dir3.iscb) 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.location, location)
self.assertEqual(dir3.label, '<span class="label label-danger pull-right">Unprocessed</span>') self.assertEqual(dir3.label, '<center><span class="label label-default">Unread</span></center>')
self.assertEqual(dir3.cur_page, 0) self.assertEqual(dir3.cur_page, 0)
def test_pages(self): def test_pages(self):
@@ -187,41 +199,3 @@ class ComicBookTests(TestCase):
def test_page_name(self): def test_page_name(self):
book = ComicBook.objects.get(file_name='test1.rar') book = ComicBook.objects.get(file_name='test1.rar')
self.assertEqual(book.page_name(0), 'img1.jpg') self.assertEqual(book.page_name(0), 'img1.jpg')

View File

@@ -107,12 +107,20 @@ def generate_directory(user, directory=False):
df = DirFile() df = DirFile()
df.name = file_name df.name = file_name
if path.isdir(path.join(base_dir, dir_path, file_name)): if path.isdir(path.join(base_dir, dir_path, file_name)):
if directory: try:
d = Directory.objects.get(name=file_name, if directory:
parent=directory) d = Directory.objects.get(name=file_name,
else: parent=directory)
d = Directory.objects.get(name=file_name, else:
parent__isnull=True) 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.isdir = True
df.icon = 'glyphicon-folder-open' df.icon = 'glyphicon-folder-open'
df.location = '/comic/{0}/'.format(urlsafe_base64_encode(d.selector.bytes).decode()) df.location = '/comic/{0}/'.format(urlsafe_base64_encode(d.selector.bytes).decode())

View File

@@ -232,7 +232,6 @@ def settings_page(request):
@login_required @login_required
def read_comic(request, comic_selector, page): def read_comic(request, comic_selector, page):
base_dir = Setting.objects.get(name='BASE_DIR').value
page = int(page) page = int(page)
selector = uuid.UUID(bytes=urlsafe_base64_decode(comic_selector)) selector = uuid.UUID(bytes=urlsafe_base64_decode(comic_selector))
book = get_object_or_404(ComicBook, selector=selector) book = get_object_or_404(ComicBook, selector=selector)

View File

@@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
import os import os
import sys import sys