fixed breadcrumbs

moved some code to util.py to clean up views.py
added migration for start of db.
This commit is contained in:
2015-06-17 13:46:02 +01:00
parent fb3e8eae5b
commit 2de1fb9491
8 changed files with 143 additions and 78 deletions

View File

@@ -5,3 +5,4 @@ from comic.models import Setting
@admin.register(Setting)
class SettingAdmin(admin.ModelAdmin):
list_display = ('name', 'value')

View File

@@ -9,3 +9,13 @@ class Setting(models.Model):
def __str__(self):
return '"%s":"%s"' % (self.name, self.value)
class ComicBook(models.Model):
file_name = models.CharField(max_length=100, unique=True)
last_read_page = models.IntegerField()
class ComicPage(models.Model):
Comic = models.ForeignKey(ComicBook)
index = models.IntegerField()
page_file_name = models.CharField(max_length=100, unique=False)
content_type = models.CharField(max_length=30)

View File

@@ -5,3 +5,28 @@ body {
padding: 40px 15px;
text-align: center;
}
/* Sticky footer styles
-------------------------------------------------- */
html {
position: relative;
min-height: 100%;
}
body {
/* Margin bottom by footer height */
margin-bottom: 60px;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
/* Set the fixed height of the footer here */
height: 60px;
background-color: #f5f5f5;
}
#dropdown-list{
max-height: 300px;
overflow: auto;
box-shadow: none;
}

View File

@@ -1,4 +1,3 @@
<!DOCTYPE html>
<html lang="en">
<head>
@@ -43,7 +42,7 @@
<ul class="nav navbar-nav">
{% block navbar %}
<li class="active"><a href="/comic/">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="settings/">Settings</a></li>
<li><a href="#contact">Contact</a></li>
{% endblock %}
</ul>
@@ -61,14 +60,18 @@
{% block content %}{% endblock %}
</div>
</div><!-- /.container -->
<!-- /.container -->
<footer class="footer">
<div class="container">
<p class="text-muted"><a href="https://github.com/ajurna/cbreader">CBReader</a></p>
</div>
</footer>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="../../static/js/bootstrap.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>

View File

@@ -1,9 +1,13 @@
{% extends "base.html" %}
{% block title %}My amazing blog{% endblock %}
{% block title %}CBreader{% endblock %}
{% block breadcrumb %}
{% for crumb in breadcrumbs %}
<li><a href="{{ crumb.url }}"{% if forloop.last %} class="active"{% endif %}>{{ crumb.name }}</a></li>
{% if not forloop.last %}
<li><a href="{{ crumb.url }}">{{ crumb.name }}</a></li>
{% else %}
<li class="active">{{ crumb.name }}</li>
{% endif %}
{% endfor %}
{% endblock %}
{% block content %}

View File

@@ -1,22 +1,35 @@
{% extends "base.html" %}
{% block breadcrumb %}
{% for crumb in breadcrumbs %}
{% if not forloop.last %}
<li><a href="{{ crumb.url }}">{{ crumb.name }}</a></li>
{% else %}
<li class="active">{{ crumb.name }}</li>
{% endif %}
{% endfor %}
{% endblock %}
{% block content %}
<center>
<br/>
<a href="/comic/read/{{ file_name }}/{{ nav.next }}/">
<img src="/comic/read/{{ file_name }}/{{ nav.cur }}/img" height="900" class="img-rounded"></img>
<img src="/comic/read/{{ file_name }}/{{ nav.cur }}/img" height="900" class="img-rounded">
</a>
<br/>
<a href="/comic/read/{{ file_name }}/{{ nav.prev }}/">Prev</a>
{% if pages %}
<select>
{% for file in pages %}
<option value="{{ file.index }}" {% if nav.cur == file.index%}selected="True"{% endif %}>{{ file.name }}</option>
{% endfor %}
</select>
{% else %}
<p>No comics.</p>
{% endif %}
<a href="/comic/read/{{ file_name }}/{{ nav.next }}/">Next</a>
<div class="btn-group">
<a href="/comic/read/{{ file_name }}/{{ nav.prev }}/" class="btn btn-default">Prev</a>
{% if pages %}
<div class="btn-group dropup">
<button type="button" data-toggle="dropdown" class="btn btn-default dropdown-toggle ">{{ orig_file_name}}<span class="caret"></span></button>
<ul class="dropdown-menu" id="dropdown-list">
{% for file in pages %}
<li><a href="/comic/read/{{ file_name }}/{{ file.index }}/">{{ file.name }}</a></li>
{% endfor %}
</ul>
</div>
{% else %}
<p>No comics.</p>
{% endif %}
<a href="/comic/read/{{ file_name }}/{{ nav.next }}/" class="btn btn-default">Next</a>
</div>
</center>
{% endblock %}

55
comic/util.py Normal file
View File

@@ -0,0 +1,55 @@
from django.utils.http import urlsafe_base64_encode
from os import path
import os
class Breadcrumb:
def __init__(self):
self.name = 'Home'
self.url = '/comic/'
def __str__(self):
return self.name
class DirFile:
def __init__(self):
self.name = ''
self.isdir = False
self.icon = ''
self.iscb = False
self.location = ''
def __str__(self):
return self.name
def generate_breadcrumbs(comic_path):
output = [Breadcrumb()]
prefix = '/comic/'
last = ''
comic_path = path.normpath(comic_path)
folders = comic_path.split(os.sep)
for item in folders:
if item == '.':
continue
bc = Breadcrumb()
bc.name = item
bc.url = prefix + urlsafe_base64_encode(item)
output.append(bc)
last = path.join(last, item)
return output
def generate_directory(base_dir, comic_path):
files = []
for fn in os.listdir(path.join(base_dir.value, comic_path)):
df = DirFile()
df.name = fn
if path.isdir(path.join(base_dir.value, comic_path, fn)):
df.isdir = True
df.icon = 'glyphicon-folder-open'
df.location = urlsafe_base64_encode(path.join(comic_path, fn))
elif fn.lower().endswith('cbz') or fn.lower().endswith('cbr'):
df.iscb = True
df.icon = 'glyphicon-book'
df.location = urlsafe_base64_encode(path.join(comic_path, fn))
files.append(df)
return files

View File

@@ -1,12 +1,13 @@
from django.http import HttpResponse
from django.template import RequestContext, loader
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.utils.http import urlsafe_base64_decode
from django.shortcuts import render
from comic.models import Setting
from util import generate_breadcrumbs, generate_directory
from unrar import rarfile
from zipfile import ZipFile
import os
from os import path
class Comic:
@@ -18,52 +19,24 @@ class Navigation:
self.next = 0
self.prev = 0
self.cur = 0
class DirFile:
def __init__(self):
self.name = ''
self.isdir = False
self.icon = ''
self.iscb = False
self.location = ''
def __str__(self):
return self.name
# Create your views here.
def index(request, comic_path=''):
base_dir = Setting.objects.get(name='BASE_DIR')
comic_path = urlsafe_base64_decode(comic_path)
breadcrumbs = generate_breadcrumbs(comic_path)
#list and classify files
files = []
for fn in os.listdir(path.join(base_dir.value, comic_path)):
df = DirFile()
df.name = fn
if path.isdir(path.join(base_dir.value, comic_path, fn)):
df.isdir = True
df.icon = 'glyphicon-folder-open'
df.location = urlsafe_base64_encode(path.join(comic_path, fn))
elif fn.lower().endswith('cbz') or fn.lower().endswith('cbr'):
df.iscb = True
df.icon = 'glyphicon-book'
df.location = urlsafe_base64_encode(path.join(comic_path, fn))
files.append(df)
template = loader.get_template('comic/index.html')
files = generate_directory(base_dir, comic_path)
context = RequestContext(request, {
'file_list': files,
'breadcrumbs': breadcrumbs,
})
return HttpResponse(template.render(context))
return render(request, 'comic/index.html', context)
def read_comic(request, comic_path, page):
encoded = comic_path
comic_path = urlsafe_base64_decode(comic_path)
breadcrumbs = generate_breadcrumbs(comic_path)
base_dir = Setting.objects.get(name='BASE_DIR')
template = loader.get_template('comic/read_comic.html')
if comic_path.lower().endswith('cbr'):
cbx = rarfile.RarFile(path.join(base_dir.value, comic_path))
elif comic_path.lower().endswith('cbz'):
@@ -79,13 +52,15 @@ def read_comic(request, comic_path, page):
comic.name = name
comic.index = idx
pages.append(comic)
context = RequestContext(request, {
'pages': pages,
'file_name': encoded,
'orig_file_name': pages[nav.cur].name,
'nav': nav,
'breadcrumbs': breadcrumbs,
})
return HttpResponse(template.render(context))
return render(request, 'comic/read_comic.html', context)
def get_image(request, comic_path, page):
base_dir = Setting.objects.get(name='BASE_DIR')
@@ -113,25 +88,4 @@ def get_image(request, comic_path, page):
img = cbx.open(page_file)
return HttpResponse(img.read(), content_type=content)
class Breadcrumb:
def __init__(self):
self.name = 'Home'
self.url = '/comic/'
def __str__(self):
return self.name
def generate_breadcrumbs(comic_path):
output = [Breadcrumb()]
prefix = '/comic/'
last = ''
comic_path = path.normpath(comic_path)
folders = comic_path.split(os.sep)
for item in folders:
if item == '.':
continue
bc = Breadcrumb()
bc.name = item
bc.url = prefix + urlsafe_base64_encode(item)
output.append(bc)
last = path.join(last, item)
return output