Merge pull request #7 from apoclyps/docker-support

[ISSUE-3] Adding docker support
This commit is contained in:
2019-07-25 22:06:52 +01:00
committed by Apoclyps
54 changed files with 2106 additions and 1476 deletions

View File

@@ -27,11 +27,11 @@ class Setting(models.Model):
class Directory(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey('Directory', null=True, blank=True, on_delete=models.CASCADE)
parent = models.ForeignKey("Directory", null=True, blank=True, on_delete=models.CASCADE)
selector = models.UUIDField(unique=True, default=uuid.uuid4, db_index=True)
def __str__(self):
return 'Directory: {0}; {1}'.format(self.name, self.parent)
return "Directory: {0}; {1}".format(self.name, self.parent)
@property
def path(self):
@@ -80,10 +80,10 @@ class ComicBook(models.Model):
@property
def selector_string(self):
return urlsafe_base64_encode(self.selector.bytes).decode()
return urlsafe_base64_encode(self.selector.bytes)
def get_image(self, page):
base_dir = Setting.objects.get(name='BASE_DIR').value
base_dir = Setting.objects.get(name="BASE_DIR").value
if self.directory:
archive_path = path.join(base_dir, self.directory.path, self.file_name)
else:
@@ -109,11 +109,11 @@ class ComicBook(models.Model):
class Navigation:
next_index = 0
next_path = ''
next_path = ""
prev_index = 0
prev_path = ''
prev_path = ""
cur_index = 0
cur_path = ''
cur_path = ""
q_prev_to_directory = False
q_next_to_directory = False
@@ -122,10 +122,7 @@ class ComicBook(models.Model):
setattr(self, arg, kwargs[arg])
def nav(self, page, user):
out = self.Navigation(
cur_index=page,
cur_path=urlsafe_base64_encode(self.selector.bytes).decode()
)
out = self.Navigation(cur_index=page, cur_path=urlsafe_base64_encode(self.selector.bytes))
if page == 0:
out.prev_path, out.prev_index = self.nav_get_prev_comic(user)
if out.prev_index == -1:
@@ -144,7 +141,7 @@ class ComicBook(models.Model):
return out
def nav_get_prev_comic(self, user):
base_dir = Setting.objects.get(name='BASE_DIR').value
base_dir = Setting.objects.get(name="BASE_DIR").value
if self.directory:
folder = path.join(base_dir, self.directory.path)
else:
@@ -153,9 +150,9 @@ class ComicBook(models.Model):
comic_index = dir_list.index(self.file_name)
if comic_index == 0:
if self.directory:
comic_path = urlsafe_base64_encode(self.directory.selector.bytes).decode()
comic_path = urlsafe_base64_encode(self.directory.selector.bytes)
else:
comic_path = ''
comic_path = ""
index = -1
else:
prev_comic = dir_list[comic_index - 1]
@@ -163,11 +160,9 @@ class ComicBook(models.Model):
if not path.isdir(path.join(folder, prev_comic)):
try:
if self.directory:
book = ComicBook.objects.get(file_name=prev_comic,
directory=self.directory)
book = ComicBook.objects.get(file_name=prev_comic, directory=self.directory)
else:
book = ComicBook.objects.get(file_name=prev_comic,
directory__isnull=True)
book = ComicBook.objects.get(file_name=prev_comic, directory__isnull=True)
except ComicBook.DoesNotExist:
if self.directory:
book = ComicBook.process_comic_book(prev_comic, self.directory)
@@ -175,17 +170,17 @@ class ComicBook(models.Model):
book = ComicBook.process_comic_book(prev_comic)
cs, _ = ComicStatus.objects.get_or_create(comic=book, user=user)
index = cs.last_read_page
comic_path = urlsafe_base64_encode(book.selector.bytes).decode()
comic_path = urlsafe_base64_encode(book.selector.bytes)
else:
if self.directory:
comic_path = urlsafe_base64_encode(self.directory.selector.bytes).decode()
comic_path = urlsafe_base64_encode(self.directory.selector.bytes)
else:
comic_path = ''
comic_path = ""
index = -1
return comic_path, index
def nav_get_next_comic(self, user):
base_dir = Setting.objects.get(name='BASE_DIR').value
base_dir = Setting.objects.get(name="BASE_DIR").value
if self.directory:
folder = path.join(base_dir, self.directory.path)
else:
@@ -196,11 +191,9 @@ class ComicBook(models.Model):
next_comic = dir_list[comic_index + 1]
try:
if self.directory:
book = ComicBook.objects.get(file_name=next_comic,
directory=self.directory)
book = ComicBook.objects.get(file_name=next_comic, directory=self.directory)
else:
book = ComicBook.objects.get(file_name=next_comic,
directory__isnull=True)
book = ComicBook.objects.get(file_name=next_comic, directory__isnull=True)
except ComicBook.DoesNotExist:
if self.directory:
book = ComicBook.process_comic_book(next_comic, self.directory)
@@ -208,25 +201,25 @@ class ComicBook(models.Model):
book = ComicBook.process_comic_book(next_comic)
if type(book) is str:
raise IndexError
comic_path = urlsafe_base64_encode(book.selector.bytes).decode()
comic_path = urlsafe_base64_encode(book.selector.bytes)
cs, _ = ComicStatus.objects.get_or_create(comic=book, user=user)
index = cs.last_read_page
except IndexError:
if self.directory:
comic_path = urlsafe_base64_encode(self.directory.selector.bytes).decode()
comic_path = urlsafe_base64_encode(self.directory.selector.bytes)
else:
comic_path = ''
comic_path = ""
index = -1
return comic_path, index
class DirFile:
def __init__(self):
self.name = ''
self.name = ""
self.isdir = False
self.icon = ''
self.icon = ""
self.iscb = False
self.location = ''
self.label = ''
self.location = ""
self.label = ""
self.cur_page = 0
def __str__(self):
@@ -234,7 +227,7 @@ class ComicBook(models.Model):
@property
def pages(self):
return [cp for cp in ComicPage.objects.filter(Comic=self).order_by('index')]
return [cp for cp in ComicPage.objects.filter(Comic=self).order_by("index")]
def page_name(self, index):
return ComicPage.objects.get(Comic=self, index=index).page_file_name
@@ -247,15 +240,14 @@ class ComicBook(models.Model):
:type directory: Directory
"""
try:
book = ComicBook.objects.get(file_name=comic_file_name,
version=0)
book = ComicBook.objects.get(file_name=comic_file_name, version=0)
book.directory = directory
book.version = 1
book.save()
return book
except ComicBook.DoesNotExist:
pass
base_dir = Setting.objects.get(name='BASE_DIR').value
base_dir = Setting.objects.get(name="BASE_DIR").value
if directory:
comic_full_path = path.join(base_dir, directory.get_path(), comic_file_name)
else:
@@ -272,32 +264,30 @@ class ComicBook(models.Model):
return comic_file_name
with atomic():
if directory:
book = ComicBook(file_name=comic_file_name,
directory=directory)
book = ComicBook(file_name=comic_file_name, directory=directory)
else:
book = ComicBook(file_name=comic_file_name)
book.save()
page_index = 0
for page_file_name in sorted([str(x) for x in cbx.namelist()], key=str.lower):
try:
dot_index = page_file_name.rindex('.') + 1
dot_index = page_file_name.rindex(".") + 1
except ValueError:
continue
ext = page_file_name.lower()[dot_index:]
if ext in ['jpg', 'jpeg']:
content_type = 'image/jpeg'
elif ext == 'png':
content_type = 'image/png'
elif ext == 'bmp':
content_type = 'image/bmp'
elif ext == 'gif':
content_type = 'image/gif'
if ext in ["jpg", "jpeg"]:
content_type = "image/jpeg"
elif ext == "png":
content_type = "image/png"
elif ext == "bmp":
content_type = "image/bmp"
elif ext == "gif":
content_type = "image/gif"
else:
content_type = 'text/plain'
page = ComicPage(Comic=book,
index=page_index,
page_file_name=page_file_name,
content_type=content_type)
content_type = "text/plain"
page = ComicPage(
Comic=book, index=page_index, page_file_name=page_file_name, content_type=content_type
)
page.save()
page_index += 1
return book
@@ -336,8 +326,12 @@ class ComicStatus(models.Model):
return self.__repr__()
def __repr__(self):
return f'<ComicStatus:{self.user.username}:{self.comic.file_name}:{self.last_read_page}:' \
f'{self.unread}:{self.finished}'
return (
f"<ComicStatus:{self.user.username}:{self.comic.file_name}:{self.last_read_page}:"
f"{self.unread}:{self.finished}"
)
# TODO: add support to reference items last being read