library bumps

version bump.
added inital build action
This commit is contained in:
Peter Dwyer
2023-08-28 11:14:53 +01:00
parent bccbff8b33
commit db23064929
9 changed files with 75 additions and 72 deletions

View File

@@ -0,0 +1,19 @@
name: Build and push image
on:
push:
branches: [main]
jobs:
deploy:
runs-on: self-hosted
defaults:
run:
working-directory: /repo
steps:
- name: Checkout repo
run: git pull
- name: Deploy
run: |
docker build . --no-cache -t ajurna/cbwebreader

View File

@@ -6,6 +6,7 @@ Django settings for cbreader project.
import os import os
from datetime import timedelta from datetime import timedelta
from pathlib import Path from pathlib import Path
from typing import Dict, List
import dj_database_url import dj_database_url
from dotenv import load_dotenv from dotenv import load_dotenv
@@ -27,7 +28,7 @@ ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS", "localhost").split(",")
# Application definition # Application definition
INSTALLED_APPS = ( INSTALLED_APPS = [
"django.contrib.admin", "django.contrib.admin",
"django.contrib.auth", "django.contrib.auth",
"django.contrib.contenttypes", "django.contrib.contenttypes",
@@ -46,7 +47,7 @@ INSTALLED_APPS = (
'django_filters', 'django_filters',
'rest_framework', 'rest_framework',
# 'silk' # 'silk'
) ]
MIDDLEWARE = [ MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware", "django.middleware.security.SecurityMiddleware",
@@ -58,8 +59,7 @@ MIDDLEWARE = [
"django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware", "django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware",
# 'silk.middleware.SilkyMiddleware', 'csp.middleware.CSPMiddleware',
# 'csp.middleware.CSPMiddleware',
] ]
ROOT_URLCONF = "cbreader.urls" ROOT_URLCONF = "cbreader.urls"
@@ -200,7 +200,7 @@ CSP_INCLUDE_NONCE_IN = ['script-src']
CSP_SCRIPT_SRC_ATTR = ("'self'",) # "'unsafe-inline'") CSP_SCRIPT_SRC_ATTR = ("'self'",) # "'unsafe-inline'")
PERMISSIONS_POLICY = { PERMISSIONS_POLICY: Dict[str, List] = {
"accelerometer": [], "accelerometer": [],
"ambient-light-sensor": [], "ambient-light-sensor": [],
"autoplay": [], "autoplay": [],

View File

@@ -1,30 +1,11 @@
from .base import * from .base import INSTALLED_APPS, MIDDLEWARE, SILK_ENABLED
INSTALLED_APPS = ( INSTALLED_APPS += ["silk"]
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
'silk',
"snowpenguin.django.recaptcha2",
'bootstrap4',
"comic",
"comic_auth",
)
MIDDLEWARE = [ MIDDLEWARE += [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
'silk.middleware.SilkyMiddleware', 'silk.middleware.SilkyMiddleware',
] ]
SILK_ENABLED = True SILK_ENABLED = True # noqa: F811
SILKY_PYTHON_PROFILER = True SILKY_PYTHON_PROFILER = True

View File

@@ -1,6 +1,6 @@
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.syndication.views import Feed from django.contrib.syndication.views import Feed
from django.db.models import Case, When, PositiveSmallIntegerField, F from django.db.models import Case, When, PositiveSmallIntegerField, F, QuerySet
from django.http import HttpRequest from django.http import HttpRequest
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
@@ -18,7 +18,7 @@ class RecentComicsAPI(Feed):
self.user = user_misc.user self.user = user_misc.user
return user_misc.user return user_misc.user
def items(self) -> ComicBook: def items(self) -> QuerySet[ComicBook]:
comics = ComicBook.objects.order_by("-date_added") comics = ComicBook.objects.order_by("-date_added")
comics = comics.annotate( comics = comics.annotate(
classification=Case( classification=Case(

View File

@@ -1,11 +1,11 @@
from typing import Optional, Union from typing import Optional
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import User from django.contrib.auth.base_user import AbstractBaseUser
from django.core.management.base import BaseCommand, CommandParser from django.core.management.base import BaseCommand, CommandParser
from loguru import logger from loguru import logger
from comic.models import ComicBook, Directory from comic.models import Directory
from comic.processing import generate_directory from comic.processing import generate_directory
@@ -27,12 +27,11 @@ class Command(BaseCommand):
self.OUTPUT = options.get('out', False) self.OUTPUT = options.get('out', False)
self.scan_directory() self.scan_directory()
def scan_directory(self, user: Optional[User] = None, directory: Optional[Directory] = None) -> None: def scan_directory(self, user: Optional[AbstractBaseUser] = None, directory: Optional[Directory] = None) -> None:
if not user: if not user:
user_model = get_user_model() user_model = get_user_model()
user = user_model.objects.first() user: AbstractBaseUser = user_model.objects.first()
for item in generate_directory(user, directory): for item in generate_directory(user, directory):
item: Union[Directory, ComicBook] if item is Directory:
if item.type == 'Directory':
logger.info(item) logger.info(item)
self.scan_directory(user, item) self.scan_directory(user, item)

View File

@@ -6,7 +6,7 @@ from typing import NamedTuple, List, Optional, Union
import rarfile import rarfile
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.base_user import AbstractBaseUser
from django.db.models import Count, Q, F, Case, When, PositiveSmallIntegerField, QuerySet, ExpressionWrapper, \ from django.db.models import Count, Q, F, Case, When, PositiveSmallIntegerField, QuerySet, ExpressionWrapper, \
IntegerField IntegerField
@@ -14,7 +14,8 @@ from comic import models
from comic.errors import NotCompatibleArchive from comic.errors import NotCompatibleArchive
def generate_directory(user: User, directory: Optional[models.Directory] = None) -> List[QuerySet]: def generate_directory(user: AbstractBaseUser, directory: Optional[models.Directory] = None) \
-> List[Union[models.Directory, models.ComicBook]]:
dir_path = Path(settings.COMIC_BOOK_VOLUME, directory.path) if directory else settings.COMIC_BOOK_VOLUME dir_path = Path(settings.COMIC_BOOK_VOLUME, directory.path) if directory else settings.COMIC_BOOK_VOLUME
files = [] files = []
@@ -74,7 +75,8 @@ def clean_directories(directories: QuerySet, dir_path: Path, directory: Optional
models.Directory.objects.get(name=stale_directory.name, parent=directory).delete() models.Directory.objects.get(name=stale_directory.name, parent=directory).delete()
def clean_files(files: QuerySet, user: User, dir_path: Path, directory: Optional[models.Directory] = None) -> None: def clean_files(files: QuerySet, user: AbstractBaseUser, dir_path: Path, directory: Optional[models.Directory] = None) \
-> None:
file_list = set(x for x in sorted(dir_path.glob('*')) if x.is_file()) file_list = set(x for x in sorted(dir_path.glob('*')) if x.is_file())
files_db_set = set(Path(dir_path, x.file_name) for x in files) files_db_set = set(Path(dir_path, x.file_name) for x in files)

0
mypy.ini Normal file
View File

View File

@@ -12,43 +12,44 @@ license = "Creative Commons Attribution-ShareAlike 4.0 International License"
python = "^3.10" python = "^3.10"
Django = "^4.1" Django = "^4.1"
gunicorn = "^20.0.4" gunicorn = "^20.0.4"
dj-database-url = "^1.0.0" dj-database-url = "^1.3.0"
python-dotenv = "^0.21.0" python-dotenv = "^1.0.0"
loguru = "^0.6.0" loguru = "^0.7.0"
django-silk = "^5.0.0" django-silk = "^5.0.0"
mysqlclient = "^2.0.1" mysqlclient = "^2.0.1"
psycopg2 = "^2.8.6" psycopg2 = "^2.9.6"
rarfile = "^4.0" rarfile = "^4.0"
django-extensions = "^3.2.1" django-extensions = "^3.2.1"
Pillow = "^9.3.0" Pillow = "^9.3.0"
django-imagekit = "^4.0.2" django-imagekit = "^4.0.2"
PyMuPDF = "~1.20.2" PyMuPDF = "~1.20.2"
django-bootstrap4 = "^22.1" django-bootstrap4 = "^23.1"
django-csp = "^3.7" django-csp = "^3.7"
django-boost = "^2.1" django-boost = "^2.1"
django-sri = "^0.5.0" django-sri = "^0.5.0"
django-permissions-policy = "^4.9.0" django-permissions-policy = "^4.15.0"
djangorestframework = "^3.13.1" djangorestframework = "^3.13.1"
django-filter = "^22.1" django-filter = "^23.1"
django-cors-headers = "^3.13.0" django-cors-headers = "^3.14.0"
djangorestframework-simplejwt = "^5.2.0" djangorestframework-simplejwt = "^5.2.0"
django-webpack-loader = "^1.6.0" django-webpack-loader = "^1.6.0"
drf-yasg = "^1.20.0" drf-yasg = "^1.20.0"
drf-extensions = "^0.7.1" drf-extensions = "^0.7.1"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
mypy = "^1.0.0" mypy = "^1.2.0"
Werkzeug = "^2.2" Werkzeug = "^2.2"
pyOpenSSL = "^22.0.0" pyOpenSSL = "^22.0.0"
ipython = "^8.4.0" ipython = "^8.12.0"
coverage = "^7.1.0" coverage = "^7.2.3"
pre-commit = "^3.0.4" pre-commit = "^3.2.2"
flake8 = "^6.0.0" flake8 = "^6.0.0"
flake8-annotations = "^3.0.0" flake8-annotations = "^3.0.0"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
pylint = "^2.15.0" pylint = "^2.15.0"
pylint-django = "^2.5.3" pylint-django = "^2.5.3"
mypy = "^1.2.0"
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["poetry-core>=1.0.0"]

View File

@@ -1,25 +1,25 @@
asgiref==3.6.0 ; python_version >= "3.10" and python_version < "4.0" asgiref==3.6.0 ; python_version >= "3.10" and python_version < "4.0"
autopep8==2.0.1 ; python_version >= "3.10" and python_version < "4.0" autopep8==2.0.2 ; python_version >= "3.10" and python_version < "4.0"
beautifulsoup4==4.11.2 ; python_version >= "3.10" and python_version < "4.0" beautifulsoup4==4.12.2 ; python_version >= "3.10" and python_version < "4.0"
certifi==2022.12.7 ; python_version >= "3.10" and python_version < "4" certifi==2022.12.7 ; python_version >= "3.10" and python_version < "4"
charset-normalizer==3.0.1 ; python_version >= "3.10" and python_version < "4" charset-normalizer==3.1.0 ; python_version >= "3.10" and python_version < "4"
colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32" colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32"
coreapi==2.3.3 ; python_version >= "3.10" and python_version < "4.0" coreapi==2.3.3 ; python_version >= "3.10" and python_version < "4.0"
coreschema==0.0.4 ; python_version >= "3.10" and python_version < "4.0" coreschema==0.0.4 ; python_version >= "3.10" and python_version < "4.0"
dj-database-url==1.2.0 ; python_version >= "3.10" and python_version < "4.0" dj-database-url==1.3.0 ; python_version >= "3.10" and python_version < "4.0"
django-appconf==1.0.5 ; python_version >= "3.10" and python_version < "4.0" django-appconf==1.0.5 ; python_version >= "3.10" and python_version < "4.0"
django-boost==2.1 ; python_version >= "3.10" and python_version < "4.0" django-boost==2.1 ; python_version >= "3.10" and python_version < "4.0"
django-bootstrap4==22.3 ; python_version >= "3.10" and python_version < "4.0" django-bootstrap4==23.1 ; python_version >= "3.10" and python_version < "4.0"
django-cors-headers==3.13.0 ; python_version >= "3.10" and python_version < "4.0" django-cors-headers==3.14.0 ; python_version >= "3.10" and python_version < "4.0"
django-csp==3.7 ; python_version >= "3.10" and python_version < "4.0" django-csp==3.7 ; python_version >= "3.10" and python_version < "4.0"
django-extensions==3.2.1 ; python_version >= "3.10" and python_version < "4.0" django-extensions==3.2.1 ; python_version >= "3.10" and python_version < "4.0"
django-filter==22.1 ; python_version >= "3.10" and python_version < "4.0" django-filter==23.1 ; python_version >= "3.10" and python_version < "4.0"
django-imagekit==4.1.0 ; python_version >= "3.10" and python_version < "4.0" django-imagekit==4.1.0 ; python_version >= "3.10" and python_version < "4.0"
django-permissions-policy==4.14.0 ; python_version >= "3.10" and python_version < "4.0" django-permissions-policy==4.15.0 ; python_version >= "3.10" and python_version < "4.0"
django-silk==5.0.3 ; python_version >= "3.10" and python_version < "4.0" django-silk==5.0.3 ; python_version >= "3.10" and python_version < "4.0"
django-sri==0.5.0 ; python_version >= "3.10" and python_version < "4.0" django-sri==0.5.0 ; python_version >= "3.10" and python_version < "4.0"
django-webpack-loader==1.8.1 ; python_version >= "3.10" and python_version < "4.0" django-webpack-loader==1.8.1 ; python_version >= "3.10" and python_version < "4.0"
django==4.1.7 ; python_version >= "3.10" and python_version < "4.0" django==4.2 ; python_version >= "3.10" and python_version < "4.0"
djangorestframework-simplejwt==5.2.2 ; python_version >= "3.10" and python_version < "4.0" djangorestframework-simplejwt==5.2.2 ; python_version >= "3.10" and python_version < "4.0"
djangorestframework==3.14.0 ; python_version >= "3.10" and python_version < "4.0" djangorestframework==3.14.0 ; python_version >= "3.10" and python_version < "4.0"
drf-extensions==0.7.1 ; python_version >= "3.10" and python_version < "4.0" drf-extensions==0.7.1 ; python_version >= "3.10" and python_version < "4.0"
@@ -30,30 +30,31 @@ idna==3.4 ; python_version >= "3.10" and python_version < "4"
inflection==0.5.1 ; python_version >= "3.10" and python_version < "4.0" inflection==0.5.1 ; python_version >= "3.10" and python_version < "4.0"
itypes==1.2.0 ; python_version >= "3.10" and python_version < "4.0" itypes==1.2.0 ; python_version >= "3.10" and python_version < "4.0"
jinja2==3.1.2 ; python_version >= "3.10" and python_version < "4.0" jinja2==3.1.2 ; python_version >= "3.10" and python_version < "4.0"
loguru==0.6.0 ; python_version >= "3.10" and python_version < "4.0" loguru==0.7.0 ; python_version >= "3.10" and python_version < "4.0"
markupsafe==2.1.2 ; python_version >= "3.10" and python_version < "4.0" markupsafe==2.1.2 ; python_version >= "3.10" and python_version < "4.0"
mysqlclient==2.1.1 ; python_version >= "3.10" and python_version < "4.0" mysqlclient==2.1.1 ; python_version >= "3.10" and python_version < "4.0"
packaging==23.0 ; python_version >= "3.10" and python_version < "4.0" packaging==23.1 ; python_version >= "3.10" and python_version < "4.0"
pilkit==2.0 ; python_version >= "3.10" and python_version < "4.0" pilkit==2.0 ; python_version >= "3.10" and python_version < "4.0"
pillow==9.4.0 ; python_version >= "3.10" and python_version < "4.0" pillow==9.5.0 ; python_version >= "3.10" and python_version < "4.0"
psycopg2==2.9.5 ; python_version >= "3.10" and python_version < "4.0" psycopg2==2.9.6 ; python_version >= "3.10" and python_version < "4.0"
pycodestyle==2.10.0 ; python_version >= "3.10" and python_version < "4.0" pycodestyle==2.10.0 ; python_version >= "3.10" and python_version < "4.0"
pyjwt==2.6.0 ; python_version >= "3.10" and python_version < "4.0" pyjwt==2.6.0 ; python_version >= "3.10" and python_version < "4.0"
pymupdf==1.20.2 ; python_version >= "3.10" and python_version < "4.0" pymupdf==1.20.2 ; python_version >= "3.10" and python_version < "4.0"
python-dotenv==0.21.1 ; python_version >= "3.10" and python_version < "4.0" python-dotenv==1.0.0 ; python_version >= "3.10" and python_version < "4.0"
pytz==2022.7.1 ; python_version >= "3.10" and python_version < "4.0" pytz==2023.3 ; python_version >= "3.10" and python_version < "4.0"
rarfile==4.0 ; python_version >= "3.10" and python_version < "4.0" rarfile==4.0 ; python_version >= "3.10" and python_version < "4.0"
requests==2.28.2 ; python_version >= "3.10" and python_version < "4" requests==2.28.2 ; python_version >= "3.10" and python_version < "4"
ruamel-yaml-clib==0.2.7 ; platform_python_implementation == "CPython" and python_version < "3.11" and python_version >= "3.10" ruamel-yaml-clib==0.2.7 ; platform_python_implementation == "CPython" and python_version < "3.11" and python_version >= "3.10"
ruamel-yaml==0.17.21 ; python_version >= "3.10" and python_version < "4.0" ruamel-yaml==0.17.21 ; python_version >= "3.10" and python_version < "4.0"
setuptools==67.3.2 ; python_version >= "3.10" and python_version < "4.0" setuptools==67.6.1 ; python_version >= "3.10" and python_version < "4.0"
six==1.16.0 ; python_version >= "3.10" and python_version < "4.0" six==1.16.0 ; python_version >= "3.10" and python_version < "4.0"
soupsieve==2.4 ; python_version >= "3.10" and python_version < "4.0" soupsieve==2.4.1 ; python_version >= "3.10" and python_version < "4.0"
sqlparse==0.4.3 ; python_version >= "3.10" and python_version < "4.0" sqlparse==0.4.3 ; python_version >= "3.10" and python_version < "4.0"
tomli==2.0.1 ; python_version >= "3.10" and python_version < "3.11" tomli==2.0.1 ; python_version >= "3.10" and python_version < "3.11"
tzdata==2022.7 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32" typing-extensions==4.5.0 ; python_version >= "3.10" and python_version < "4.0"
tzdata==2023.3 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32"
ua-parser==0.16.1 ; python_version >= "3.10" and python_version < "4.0" ua-parser==0.16.1 ; python_version >= "3.10" and python_version < "4.0"
uritemplate==4.1.1 ; python_version >= "3.10" and python_version < "4.0" uritemplate==4.1.1 ; python_version >= "3.10" and python_version < "4.0"
urllib3==1.26.14 ; python_version >= "3.10" and python_version < "4" urllib3==1.26.15 ; python_version >= "3.10" and python_version < "4"
user-agents==2.2.0 ; python_version >= "3.10" and python_version < "4.0" user-agents==2.2.0 ; python_version >= "3.10" and python_version < "4.0"
win32-setctime==1.1.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32" win32-setctime==1.1.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32"