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):
|
||||
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)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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'),
|
||||
]
|
||||
|
||||
@@ -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(),
|
||||
})
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user