From fdf783dbc7877d78d8a28231a8d7599322bb3e53 Mon Sep 17 00:00:00 2001 From: ajurna Date: Thu, 18 Jun 2015 21:20:14 +0100 Subject: [PATCH] changed it so next and previous buttons move between comics. --- comic/admin.py | 3 +- comic/models.py | 151 +++++++++++++++++++++++--- comic/templates/comic/read_comic.html | 18 ++- comic/util.py | 48 -------- comic/views.py | 4 +- 5 files changed, 152 insertions(+), 72 deletions(-) diff --git a/comic/admin.py b/comic/admin.py index 5d47eb9..71b5212 100644 --- a/comic/admin.py +++ b/comic/admin.py @@ -13,4 +13,5 @@ class ComicBookAdmin(admin.ModelAdmin): @admin.register(ComicPage) class ComicPageAdmin(admin.ModelAdmin): - list_display = ('Comic', 'index', 'page_file_name', 'content_type') \ No newline at end of file + list_display = ('Comic', 'index', 'page_file_name', 'content_type') + list_filter = ['Comic'] \ No newline at end of file diff --git a/comic/models.py b/comic/models.py index 4aae096..edf1544 100644 --- a/comic/models.py +++ b/comic/models.py @@ -1,7 +1,14 @@ from django.db import models +from django.db.models import Max +from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode + + + from unrar import rarfile import zipfile -# Create your models here. +from os import path +import os + class Setting(models.Model): name = models.CharField(max_length=50, unique=True) @@ -13,24 +20,14 @@ class Setting(models.Model): def __unicode__(self): return self.__str__() + class ComicBook(models.Model): file_name = models.CharField(max_length=100, unique=True) last_read_page = models.IntegerField() - class Comic: - def __init__(self): - self.name = '' - self.index = 0 - class Navigation: - def __init__(self): - self.next_index = 0 - self.next_path = '' - self.prev_index = 0 - self.prev_path = '' - self.cur_index = 0 - self.cur_path = '' def __str__(self): return self.file_name + def get_image(self, archive_path, page): try: archive = rarfile.RarFile(archive_path) @@ -39,18 +36,88 @@ class ComicBook(models.Model): except zipfile.BadZipfile: return False page_obj = ComicPage.objects.get(Comic=self, index=page) + out = (archive.open(page_obj.page_file_name), page_obj.content_type) + return out - return (archive.open(page_obj.page_file_name), page_obj.content_type) + def is_last_page(self, page): + page_count = ComicPage.objects.filter(Comic=self).count() + if (page_count - 1) == page: + return True + return False + + class Navigation: + def __init__(self): + self.next_index = 0 + self.next_path = '' + self.prev_index = 0 + self.prev_path = '' + self.cur_index = 0 + self.cur_path = '' + self.q_prev_comic = False + self.q_next_to_directory = False def nav(self, comic_path, page): out = self.Navigation() out.cur_index = page out.cur_path = comic_path - out.prev_index = page - 1 - out.next_index = page + 1 - out.prev_path = comic_path - out.next_path = comic_path + + if page == 0: + out.prev_path, out.prev_index = self.nav_get_prev_comic(comic_path) + if out.prev_index == -1: + out.q_prev_to_directory = True + else: + out.prev_index = page - 1 + out.prev_path = comic_path + + if self.is_last_page(page): + out.next_path, out.next_index = self.nav_get_next_comic(comic_path) + if out.next_index == -1: + out.q_next_to_directory = True + else: + out.next_index = page + 1 + out.next_path = comic_path + return out + def nav_get_prev_comic(self, comic_path): + base_dir = Setting.objects.get(name='BASE_DIR') + comic_path = urlsafe_base64_decode(comic_path) + directory, comic = path.split(comic_path) + dir_list = os.listdir(path.join(base_dir.value, directory)) + comic_index = dir_list.index(comic) + if comic_index == 0: + comic_path = urlsafe_base64_encode(directory) + index = -1 + else: + prev_comic = dir_list[comic_index - 1] + comic_path = path.join(directory, prev_comic) + try: + book = ComicBook.objects.get(file_name=prev_comic) + except ComicBook.DoesNotExist: + book = process_comic_book(base_dir, comic_path, prev_comic) + index = ComicPage.objects.filter(Comic=book).count() - 1 + print index + comic_path = urlsafe_base64_encode(comic_path) + return comic_path, index + def nav_get_next_comic(self, comic_path): + base_dir = Setting.objects.get(name='BASE_DIR') + comic_path = urlsafe_base64_decode(comic_path) + directory, comic = path.split(comic_path) + dir_list = os.listdir(path.join(base_dir.value, directory)) + comic_index = dir_list.index(comic) + try: + next_comic = dir_list[comic_index + 1] + comic_path = path.join(directory, next_comic) + comic_path = urlsafe_base64_encode(comic_path) + index = 0 + except IndexError: + comic_path = urlsafe_base64_encode(directory) + index = -1 + return comic_path, index + class Comic: + def __init__(self): + self.name = '' + self.index = 0 + def pages(self): out = [] for item in ComicPage.objects.filter(Comic=self).order_by('index'): @@ -59,8 +126,56 @@ class ComicBook(models.Model): i.index = item.index out.append(i) return out +def process_comic_book(base_dir, comic_path, comic_file_name): + try: + cbx = rarfile.RarFile(path.join(base_dir.value, comic_path)) + except rarfile.BadRarFile: + cbx = zipfile.ZipFile(path.join(base_dir.value, comic_path)) + except zipfile.BadZipfile: + return False + + book = ComicBook(file_name=comic_file_name, + last_read_page=0) + book.save() + i = 0 + for f in cbx.namelist(): + ext = f.lower()[-3:] + if ext in ['jpg', 'jpeg']: + page = ComicPage(Comic=book, + index=i, + page_file_name=f, + content_type='image/jpeg') + page.save() + i += 1 + elif ext == 'png': + page = ComicPage(Comic=book, + index=i, + page_file_name=f, + content_type='image/png') + page.save() + i += 1 + elif ext == 'bmp': + page = ComicPage(Comic=book, + index=i, + page_file_name=f, + content_type='image/bmp') + page.save() + i += 1 + elif ext == 'gif': + page = ComicPage(Comic=book, + index=i, + page_file_name=f, + content_type='image/gif') + page.save() + i += 1 + + return book + class ComicPage(models.Model): Comic = models.ForeignKey(ComicBook) index = models.IntegerField() page_file_name = models.CharField(max_length=100, unique=False) content_type = models.CharField(max_length=30) + + + diff --git a/comic/templates/comic/read_comic.html b/comic/templates/comic/read_comic.html index bce1ef8..d3acbf5 100644 --- a/comic/templates/comic/read_comic.html +++ b/comic/templates/comic/read_comic.html @@ -11,12 +11,20 @@ {% block content %}

- + {% if nav.q_next_to_directory %} + + {% else %} + + {% endif %}
- Prev + {% if nav.q_prev_to_directory %} + Next + {% else %} + Prev + {% endif %} {% if book.pages %}
@@ -29,7 +37,11 @@ {% else %} {% endif %} - Next + {% if nav.q_next_to_directory %} + Next + {% else %} + Next + {% endif %}
{% endblock %} \ No newline at end of file diff --git a/comic/util.py b/comic/util.py index 57a776d..4e2b9ae 100644 --- a/comic/util.py +++ b/comic/util.py @@ -26,54 +26,6 @@ class DirFile: def __str__(self): return self.name - - -def process_comic_book(base_dir, comic_path, comic_file_name): - try: - cbx = rarfile.RarFile(path.join(base_dir.value, comic_path)) - except rarfile.BadRarFile: - cbx = zipfile.ZipFile(path.join(base_dir.value, comic_path)) - except zipfile.BadZipfile: - return False - - book = ComicBook(file_name=comic_file_name, - last_read_page=0) - book.save() - i = 0 - for f in cbx.namelist(): - ext = f.lower()[-3:] - if ext in ['jpg', 'jpeg']: - page = ComicPage(Comic=book, - index=i, - page_file_name=f, - content_type='image/jpeg') - page.save() - i += 1 - elif ext == 'png': - page = ComicPage(Comic=book, - index=i, - page_file_name=f, - content_type='image/png') - page.save() - i += 1 - elif ext == 'bmp': - page = ComicPage(Comic=book, - index=i, - page_file_name=f, - content_type='image/bmp') - page.save() - i += 1 - elif ext == 'gif': - page = ComicPage(Comic=book, - index=i, - page_file_name=f, - content_type='image/gif') - page.save() - i += 1 - - return book - - def generate_breadcrumbs(comic_path): output = [Breadcrumb()] prefix = '/comic/' diff --git a/comic/views.py b/comic/views.py index 41ddbb0..631bd2e 100644 --- a/comic/views.py +++ b/comic/views.py @@ -3,8 +3,8 @@ from django.template import RequestContext from django.utils.http import urlsafe_base64_decode from django.shortcuts import render -from comic.models import Setting, ComicBook -from util import generate_breadcrumbs, generate_directory, process_comic_book +from comic.models import Setting, ComicBook, process_comic_book +from util import generate_breadcrumbs, generate_directory from os import path