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):
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)
last_read_page = models.IntegerField(default=0)
unread = models.BooleanField(default=True)
@@ -329,3 +329,8 @@ class ComicStatus(models.Model):
def __str__(self):
return 'C:{0} P:{1}'.format(self.comic.file_name, self.last_read_page)
# 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/">
{% csrf_token %}
<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:
<select name="func" id="func_selector">
<option value="choose">Choose...</option>
@@ -58,7 +58,7 @@ $(document).ready(function() {
var r = $(row);
var cols = $('td:nth-child(n+2)', row);
cols.attr('data-href', data['url']);
cols.attr('style', 'cursor: pointer;')
cols.attr('style', 'cursor: pointer;');;;;;;;;;;;;;;;;;;;;;;;;;;;;
cols.click(function() {
window.document.location = $(this).data("href");
});
@@ -74,9 +74,9 @@ $(document).ready(function() {
var tds = $('table tr td:first-child');
tds.click(function(event){
if (!$(event.target).is('input')) {
var $cb = $('input', this)
var $cb = $('input', this);;;;;;;;;;;;;;;;;;;;;;;;;;;;
$cb.click();
};
}
});
},
"columns": [
@@ -104,12 +104,12 @@ $(document).ready(function() {
});
$('#select-all').click(function(event){
var cb = $('input', this)
var cb = $('input', this);;;;;;;;;;;;;;;;;;;;;;;;;;;;
if (!$(event.target).is('input')) {
cb.click();
};
}
$('table tr td:first-child input').each(function(chkbx) {
row = $(this)
row = $(this);;;;;;;;;;;;;;;;;;;;;;;;;;;;
if (row.prop('checked') != cb.prop('checked')){
row.click();
}

View File

@@ -1,7 +1,7 @@
from django.conf.urls import url
from . import feeds
from . import views
urlpatterns = [
url(r'^$', views.comic_list, name='index'),
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/json/$', views.recent_comics_json, name='recent_comics_json'),
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'),
]

View File

@@ -17,7 +17,7 @@ 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 .models import Setting, ComicBook, ComicStatus, Directory, ComicPage, UserMisc
from .util import generate_breadcrumbs_from_path, generate_breadcrumbs_from_menu, \
generate_title_from_path, Menu, generate_directory, generate_label
@@ -86,12 +86,15 @@ def comic_list_json(request, directory_selector=False):
@login_required
def recent_comics(request):
feed_id = UserMisc.objects.get(user=request.user)
return render(request,
'comic/recent_comics.html',
{
'breadcrumbs': generate_breadcrumbs_from_menu([('Recent', '/comic/recent/')]),
'menu': Menu(request.user, 'Recent'),
'title': 'Recent Comics'
'title': 'Recent Comics',
'feed_id': urlsafe_base64_encode(feed_id.feed_id.bytes).decode(),
})