mirror of
https://github.com/ajurna/cbwebreader.git
synced 2025-12-06 06:17:17 +00:00
added feed of recent comics.
This commit is contained in:
30
comic/feeds.py
Normal file
30
comic/feeds.py
Normal 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())
|
||||||
28
comic/migrations/0017_usermisc.py
Normal file
28
comic/migrations/0017_usermisc.py
Normal 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)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
22
comic/migrations/0018_auto_20170113_1531.py
Normal file
22
comic/migrations/0018_auto_20170113_1531.py
Normal 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),
|
||||||
|
]
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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'),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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(),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user