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 %}
+
+ {% csrf_token %} - + + @@ -20,30 +29,17 @@

Comics

Comics

mark selected issues as: + +
File/Folder Status
- +
+ {% 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 %} +
+
+ {% csrf_token %} + + + + + + + + + + + + + + + + + + +

Recent Comics

+ mark selected issues as: + +
+
+
File/FolderDate AddedStatus
+
+
loading data1/23
+
+
+ +{% 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 = []