added feed of recent comics.

This commit is contained in:
2017-01-16 10:42:49 +00:00
parent a9ce887dcc
commit a3dfcc451e
7 changed files with 100 additions and 11 deletions

30
comic/feeds.py Normal file
View File

@@ -0,0 +1,30 @@
import uuid
from django.contrib.syndication.views import Feed
from django.shortcuts import get_object_or_404
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from .models import ComicBook, UserMisc
class RecentComics(Feed):
title = "CBWebReader Recent Comics"
link = "/comics/"
description = "Recently added Comics"
def get_object(self, request, user_selector, *args, **kwargs):
user_selector = uuid.UUID(bytes=urlsafe_base64_decode(user_selector))
return get_object_or_404(UserMisc, feed_id=user_selector)
def items(self):
return ComicBook.objects.order_by('-date_added')[:10]
def item_title(self, item: ComicBook):
return item.file_name
def item_description(self, item: ComicBook):
return item.date_added.isoformat()
# item_link is only needed if NewsItem has no get_absolute_url method.
def item_link(self, item: ComicBook):
return '/comic/read/{0}/0/'.format(urlsafe_base64_encode(item.selector.bytes).decode())

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-01-13 15:28
from __future__ import unicode_literals
import uuid
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('comic', '0016_auto_20160414_1335'),
]
operations = [
migrations.CreateModel(
name='UserMisc',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('feed_id', models.UUIDField(db_index=True, default=uuid.uuid4, unique=True)),
(
'user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-01-13 15:31
from __future__ import unicode_literals
from django.db import migrations
def gen_feeds(apps, schema_editor):
user_misc = apps.get_model('comic', 'UserMisc')
User = apps.get_model('auth', 'user')
for user in User.objects.all():
um = user_misc.objects.create(user=user)
class Migration(migrations.Migration):
dependencies = [
('comic', '0017_usermisc'),
]
operations = [
migrations.RunPython(gen_feeds, reverse_code=migrations.RunPython.noop),
]

View File

@@ -316,7 +316,7 @@ class ComicPage(models.Model):
class ComicStatus(models.Model): class ComicStatus(models.Model):
user = models.ForeignKey(User, unique=False, null=False) user = models.ForeignKey(User, unique=False, null=False, on_delete=models.CASCADE)
comic = models.ForeignKey(ComicBook, unique=False, null=False, on_delete=models.CASCADE) comic = models.ForeignKey(ComicBook, unique=False, null=False, on_delete=models.CASCADE)
last_read_page = models.IntegerField(default=0) last_read_page = models.IntegerField(default=0)
unread = models.BooleanField(default=True) unread = models.BooleanField(default=True)
@@ -329,3 +329,8 @@ class ComicStatus(models.Model):
def __str__(self): def __str__(self):
return 'C:{0} P:{1}'.format(self.comic.file_name, self.last_read_page) return 'C:{0} P:{1}'.format(self.comic.file_name, self.last_read_page)
# TODO: add support to reference items last being read # TODO: add support to reference items last being read
class UserMisc(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
feed_id = models.UUIDField(unique=True, default=uuid.uuid4, db_index=True)

View File

@@ -6,7 +6,7 @@
<form id="comic_form" method="post" action="/comic/edit/"> <form id="comic_form" method="post" action="/comic/edit/">
{% csrf_token %} {% csrf_token %}
<table class="table table-bordered table-striped table-hover" id="comic_list"> <table class="table table-bordered table-striped table-hover" id="comic_list">
<caption><h2>Recent Comics</h2> <caption><h2>Recent Comics - <a href="/comic/feed/{{ feed_id }}/">Feed</a></h2>
mark selected issues as: mark selected issues as:
<select name="func" id="func_selector"> <select name="func" id="func_selector">
<option value="choose">Choose...</option> <option value="choose">Choose...</option>
@@ -58,7 +58,7 @@ $(document).ready(function() {
var r = $(row); var r = $(row);
var cols = $('td:nth-child(n+2)', row); var cols = $('td:nth-child(n+2)', row);
cols.attr('data-href', data['url']); cols.attr('data-href', data['url']);
cols.attr('style', 'cursor: pointer;') cols.attr('style', 'cursor: pointer;');;;;;;;;;;;;;;;;;;;;;;;;;;;;
cols.click(function() { cols.click(function() {
window.document.location = $(this).data("href"); window.document.location = $(this).data("href");
}); });
@@ -74,9 +74,9 @@ $(document).ready(function() {
var tds = $('table tr td:first-child'); var tds = $('table tr td:first-child');
tds.click(function(event){ tds.click(function(event){
if (!$(event.target).is('input')) { if (!$(event.target).is('input')) {
var $cb = $('input', this) var $cb = $('input', this);;;;;;;;;;;;;;;;;;;;;;;;;;;;
$cb.click(); $cb.click();
}; }
}); });
}, },
"columns": [ "columns": [
@@ -104,12 +104,12 @@ $(document).ready(function() {
}); });
$('#select-all').click(function(event){ $('#select-all').click(function(event){
var cb = $('input', this) var cb = $('input', this);;;;;;;;;;;;;;;;;;;;;;;;;;;;
if (!$(event.target).is('input')) { if (!$(event.target).is('input')) {
cb.click(); cb.click();
}; }
$('table tr td:first-child input').each(function(chkbx) { $('table tr td:first-child input').each(function(chkbx) {
row = $(this) row = $(this);;;;;;;;;;;;;;;;;;;;;;;;;;;;
if (row.prop('checked') != cb.prop('checked')){ if (row.prop('checked') != cb.prop('checked')){
row.click(); row.click();
} }

View File

@@ -1,7 +1,7 @@
from django.conf.urls import url from django.conf.urls import url
from . import feeds
from . import views from . import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.comic_list, name='index'), url(r'^$', views.comic_list, name='index'),
url(r'^settings/$', views.settings_page, name='settings'), url(r'^settings/$', views.settings_page, name='settings'),
@@ -16,5 +16,6 @@ urlpatterns = [
url(r'^recent/$', views.recent_comics, name='recent_comics'), url(r'^recent/$', views.recent_comics, name='recent_comics'),
url(r'^recent/json/$', views.recent_comics_json, name='recent_comics_json'), url(r'^recent/json/$', views.recent_comics_json, name='recent_comics_json'),
url(r'^edit/$', views.comic_edit, name='comic_edit'), url(r'^edit/$', views.comic_edit, name='comic_edit'),
url(r'^feed/(?P<user_selector>[\w-]+)/$', feeds.RecentComics()),
url(r'^(?P<directory_selector>[\w-]+)/$', views.comic_list, name='comic_list'), url(r'^(?P<directory_selector>[\w-]+)/$', views.comic_list, name='comic_list'),
] ]

View File

@@ -17,7 +17,7 @@ from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.decorators.http import require_POST from django.views.decorators.http import require_POST
from .forms import SettingsForm, AccountForm, EditUserForm, AddUserForm, InitialSetupForm from .forms import SettingsForm, AccountForm, EditUserForm, AddUserForm, InitialSetupForm
from .models import Setting, ComicBook, ComicStatus, Directory, ComicPage from .models import Setting, ComicBook, ComicStatus, Directory, ComicPage, UserMisc
from .util import generate_breadcrumbs_from_path, generate_breadcrumbs_from_menu, \ from .util import generate_breadcrumbs_from_path, generate_breadcrumbs_from_menu, \
generate_title_from_path, Menu, generate_directory, generate_label generate_title_from_path, Menu, generate_directory, generate_label
@@ -86,12 +86,15 @@ def comic_list_json(request, directory_selector=False):
@login_required @login_required
def recent_comics(request): def recent_comics(request):
feed_id = UserMisc.objects.get(user=request.user)
return render(request, return render(request,
'comic/recent_comics.html', 'comic/recent_comics.html',
{ {
'breadcrumbs': generate_breadcrumbs_from_menu([('Recent', '/comic/recent/')]), 'breadcrumbs': generate_breadcrumbs_from_menu([('Recent', '/comic/recent/')]),
'menu': Menu(request.user, 'Recent'), 'menu': Menu(request.user, 'Recent'),
'title': 'Recent Comics' 'title': 'Recent Comics',
'feed_id': urlsafe_base64_encode(feed_id.feed_id.bytes).decode(),
}) })