From 58ff1060e6a78ae4fa52cec49fbd0d3cb78401e5 Mon Sep 17 00:00:00 2001
From: "ajurna@gmail.com"
Date: Wed, 13 Apr 2016 15:51:35 +0100
Subject: [PATCH] made major changes to interface. can now mark comics as read!
also added a recently added section.
---
cbreader/settings.py | 2 +-
comic/static/css/base.css | 2 +-
comic/templates/base.html | 2 +-
comic/templates/comic/comic_list.html | 87 +++++++++++-----
comic/templates/comic/recent_comics.html | 123 +++++++++++++++++++++++
comic/urls.py | 3 +
comic/util.py | 40 +++++---
comic/views.py | 92 ++++++++++++++++-
8 files changed, 305 insertions(+), 46 deletions(-)
create mode 100644 comic/templates/comic/recent_comics.html
diff --git a/cbreader/settings.py b/cbreader/settings.py
index 5074980..fd73616 100644
--- a/cbreader/settings.py
+++ b/cbreader/settings.py
@@ -88,7 +88,7 @@ DATABASES = {
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/
-LANGUAGE_CODE = 'en-us'
+LANGUAGE_CODE = 'en-ie'
TIME_ZONE = 'UTC'
diff --git a/comic/static/css/base.css b/comic/static/css/base.css
index 19fa66d..24b77ab 100644
--- a/comic/static/css/base.css
+++ b/comic/static/css/base.css
@@ -39,4 +39,4 @@ body {
}
tr.clickable-row {
cursor: pointer;
- }
\ No newline at end of file
+ }
diff --git a/comic/templates/base.html b/comic/templates/base.html
index cacdff5..1aa1871 100644
--- a/comic/templates/base.html
+++ b/comic/templates/base.html
@@ -72,7 +72,7 @@
-
+
{% block script %}
diff --git a/comic/templates/comic/comic_list.html b/comic/templates/comic/comic_list.html
index dd367fc..c7ccc6c 100644
--- a/comic/templates/comic/comic_list.html
+++ b/comic/templates/comic/comic_list.html
@@ -3,10 +3,19 @@
{% block content %}
+
{% endblock %}
{% block script %}
{% endblock %}
\ No newline at end of file
diff --git a/comic/templates/comic/recent_comics.html b/comic/templates/comic/recent_comics.html
new file mode 100644
index 0000000..0bd8953
--- /dev/null
+++ b/comic/templates/comic/recent_comics.html
@@ -0,0 +1,123 @@
+{% extends "base.html" %}
+{% block title %}{{ title }}{% endblock %}
+
+{% block content %}
+
+
+{% endblock %}
+
+{% block script %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/comic/urls.py b/comic/urls.py
index ad519f3..28208ff 100644
--- a/comic/urls.py
+++ b/comic/urls.py
@@ -13,5 +13,8 @@ urlpatterns = [
url(r'^read/(?P[\w-]+)/(?P[0-9]+)/img$', views.get_image, name='get_image'),
url(r'^list_json/$', views.comic_list_json, name='comic_list_json1'),
url(r'^list_json/(?P[\w-]+)/$', views.comic_list_json, name='comic_list_json2'),
+ url(r'^recent/$', views.recent_comics, name='recent_comics'),
+ url(r'^recent/json/$', views.recent_comics_json, name='recent_comics_json'),
+ url(r'^edit/$', views.comic_edit, name='comic_edit'),
url(r'^(?P[\w-]+)/$', views.comic_list, name='comic_list'),
]
diff --git a/comic/util.py b/comic/util.py
index bf87e9c..105d8f0 100644
--- a/comic/util.py
+++ b/comic/util.py
@@ -20,6 +20,7 @@ class Menu:
"""
self.menu_items = OrderedDict()
self.menu_items['Browse'] = '/comic/'
+ self.menu_items['Recent'] = '/comic/recent/'
self.menu_items['Account'] = '/comic/account/'
if user.is_superuser:
self.menu_items['Settings'] = '/comic/settings/'
@@ -84,6 +85,8 @@ class DirFile:
self.location = ''
self.label = ''
self.cur_page = 0
+ self.type = ''
+ self.selector = ''
def __str__(self):
return self.name
@@ -91,7 +94,6 @@ class DirFile:
def generate_directory(user, directory=False):
"""
-
:type user: User
:type directory: Directory
"""
@@ -123,8 +125,10 @@ def generate_directory(user, directory=False):
d.save()
df.isdir = True
df.icon = 'glyphicon-folder-open'
- df.location = '/comic/{0}/'.format(urlsafe_base64_encode(d.selector.bytes).decode())
+ df.selector = urlsafe_base64_encode(d.selector.bytes).decode()
+ df.location = '/comic/{0}/'.format(df.selector)
df.label = generate_dir_status(user, d)
+ df.type = 'directory'
elif file_name.lower()[-4:] in ['.rar', '.zip', '.cbr', '.cbz']:
df.iscb = True
df.icon = 'glyphicon-book'
@@ -138,26 +142,32 @@ def generate_directory(user, directory=False):
except ComicBook.DoesNotExist:
book = ComicBook.process_comic_book(file_name, directory)
- status, _ = ComicStatus.objects.get_or_create(comic=book, user=user)
+ status, created = ComicStatus.objects.get_or_create(comic=book, user=user)
+ if created:
+ status.save()
last_page = status.last_read_page
- df.location = '/comic/read/{0}/{1}/'.format(urlsafe_base64_encode(book.selector.bytes).decode(),
+ df.selector = urlsafe_base64_encode(book.selector.bytes).decode()
+ df.location = '/comic/read/{0}/{1}/'.format(df.selector,
last_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
+ df.cur_page = last_page
+ df.label = generate_label(book, status)
+ df.type = 'book'
- # df.label = 'Unprocessed'
files.append(df)
return files
+def generate_label(book, status):
+ if status.unread:
+ label_text = 'Unread'
+ elif (status.last_read_page + 1) == book.page_count:
+ label_text = 'Read'
+ else:
+ label_text = '%s/%s' % \
+ (status.last_read_page + 1, book.page_count)
+ return label_text
+
+
def generate_dir_status(user, directory):
cb_list = ComicBook.objects.filter(directory=directory)
total = cb_list.count()
diff --git a/comic/views.py b/comic/views.py
index 5b214c2..4b91202 100644
--- a/comic/views.py
+++ b/comic/views.py
@@ -6,18 +6,20 @@ from django.contrib.auth import login, authenticate
from django.contrib.auth.decorators import login_required, user_passes_test
from django.contrib.auth.models import User
from django.db.models import Max
+from django.db.transaction import atomic
from django.http import HttpResponse
from django.shortcuts import render, redirect, get_object_or_404
-from django.utils.http import urlsafe_base64_decode
+from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.decorators.http import require_POST
from .forms import SettingsForm, AccountForm, EditUserForm, AddUserForm, InitialSetupForm
from .models import Setting, ComicBook, ComicStatus, Directory, ComicPage
from .util import generate_breadcrumbs_from_path, generate_breadcrumbs_from_menu, \
- generate_title_from_path, Menu, generate_directory
+ generate_title_from_path, Menu, generate_directory, generate_label
+# noinspection PyTypeChecker
@ensure_csrf_cookie
@login_required
def comic_list(request, directory_selector=False):
@@ -42,10 +44,8 @@ def comic_list(request, directory_selector=False):
title = generate_title_from_path('Home')
breadcrumbs = generate_breadcrumbs_from_path()
json_url = '/comic/list_json/'
- files = generate_directory(request.user)
return render(request, 'comic/comic_list.html', {
- 'file_list': files,
'breadcrumbs': breadcrumbs,
'menu': Menu(request.user, 'Browse'),
'title': title,
@@ -67,6 +67,9 @@ def comic_list_json(request, directory_selector=False):
response_data['data'] = []
for file in files:
response_data['data'].append({
+ 'blank': '',
+ 'selector': file.selector,
+ 'type': file.type,
'icon': icon_str.format(file.icon),
'name': file.name,
'label': file.label,
@@ -78,6 +81,87 @@ def comic_list_json(request, directory_selector=False):
)
+@login_required
+def recent_comics(request):
+ return render(request,
+ 'comic/recent_comics.html',
+ {
+ 'breadcrumbs': generate_breadcrumbs_from_menu([('Recent', '/comic/recent/')]),
+ 'menu': Menu(request.user, 'Recent'),
+ 'title': 'Recent Comics'
+ })
+
+
+@login_required
+@require_POST
+def recent_comics_json(request):
+ start = int(request.POST['start'])
+ end = start + int(request.POST['length'])
+ icon = ''
+ comics = ComicBook.objects.all()
+ response_data = dict()
+ response_data['recordsTotal'] = comics.count()
+ if request.POST['search[value]']:
+ comics = comics.filter(file_name__contains=request.POST['search[value]'])
+ order_string = ''
+ # Ordering
+ if request.POST['order[0][dir]'] == 'desc':
+ order_string += '-'
+ if request.POST['order[0][dir]'] == '3':
+ order_string += 'date_added'
+ elif request.POST['order[0][dir]'] == '2':
+ order_string += 'date_added'
+ else:
+ order_string += 'date_added'
+ comics = comics.order_by(order_string)
+ response_data['recordsFiltered'] = comics.count()
+ response_data['data'] = list()
+ for book in comics[start:end]:
+ status, created = ComicStatus.objects.get_or_create(comic=book,
+ user=request.user)
+ if created:
+ status.save()
+ response_data['data'].append({
+ 'selector': urlsafe_base64_encode(book.selector.bytes).decode(),
+ 'icon': icon,
+ 'type': 'book',
+ 'name': book.file_name,
+ 'date': book.date_added.strftime('%d/%m/%y-%H:%M'),
+ 'label': generate_label(book, status),
+ 'url': '/comic/read/{0}/{1}/'.format(urlsafe_base64_encode(book.selector.bytes).decode(),
+ status.last_read_page)
+ })
+ return HttpResponse(
+ json.dumps(response_data),
+ content_type="application/json"
+ )
+
+
+@login_required
+@require_POST
+def comic_edit(request):
+ if 'selected' not in request.POST:
+ return HttpResponse(status=200)
+ if request.POST['func'] == 'choose':
+ return HttpResponse(status=200)
+ selected = [uuid.UUID(bytes=urlsafe_base64_decode(item)) for item in request.POST.getlist('selected')]
+ comics = ComicBook.objects.filter(selector__in=selected)
+ with atomic():
+ for comic in comics:
+ status, _ = ComicStatus.objects.get_or_create(comic=comic,
+ user=request.user)
+ if request.POST['func'] == 'read':
+ status.unread = False
+ status.finished = True
+ status.last_read_page = comic.page_count - 1
+ elif request.POST['func'] == 'unread':
+ status.unread = True
+ status.finished = False
+ status.last_read_page = 0
+ status.save()
+ return HttpResponse(status=200)
+
+
@login_required
def account_page(request):
success_message = []