From db230649290ddb995fd05bc2000328e720f97b0e Mon Sep 17 00:00:00 2001 From: Peter Dwyer Date: Mon, 28 Aug 2023 11:14:53 +0100 Subject: [PATCH] library bumps version bump. added inital build action --- .gitea/workflows/build.yaml | 19 ++++++++++++ cbreader/settings/base.py | 12 ++++---- cbreader/settings/dev.py | 27 +++------------- comic/feeds.py | 4 +-- comic/management/commands/scan_comics.py | 13 ++++---- comic/processing.py | 8 +++-- mypy.ini | 0 pyproject.toml | 25 +++++++-------- requirements.txt | 39 ++++++++++++------------ 9 files changed, 75 insertions(+), 72 deletions(-) create mode 100644 .gitea/workflows/build.yaml create mode 100644 mypy.ini diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..be1d2c5 --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -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 diff --git a/cbreader/settings/base.py b/cbreader/settings/base.py index 1f833fe..43583db 100644 --- a/cbreader/settings/base.py +++ b/cbreader/settings/base.py @@ -6,6 +6,7 @@ Django settings for cbreader project. import os from datetime import timedelta from pathlib import Path +from typing import Dict, List import dj_database_url from dotenv import load_dotenv @@ -27,7 +28,7 @@ ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS", "localhost").split(",") # Application definition -INSTALLED_APPS = ( +INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", @@ -46,7 +47,7 @@ INSTALLED_APPS = ( 'django_filters', 'rest_framework', # 'silk' -) +] MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", @@ -58,8 +59,7 @@ MIDDLEWARE = [ "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", - # 'silk.middleware.SilkyMiddleware', - # 'csp.middleware.CSPMiddleware', + 'csp.middleware.CSPMiddleware', ] ROOT_URLCONF = "cbreader.urls" @@ -197,10 +197,10 @@ CSP_FONT_SRC = ("'self'",) CSP_SCRIPT_SRC = ("'self'",) CSP_CONNECT_SRC = ("'self'",) 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": [], "ambient-light-sensor": [], "autoplay": [], diff --git a/cbreader/settings/dev.py b/cbreader/settings/dev.py index 3badf6b..e0a8345 100644 --- a/cbreader/settings/dev.py +++ b/cbreader/settings/dev.py @@ -1,30 +1,11 @@ -from .base import * +from .base import INSTALLED_APPS, MIDDLEWARE, SILK_ENABLED -INSTALLED_APPS = ( - "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", -) +INSTALLED_APPS += ["silk"] -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", +MIDDLEWARE += [ 'silk.middleware.SilkyMiddleware', ] -SILK_ENABLED = True +SILK_ENABLED = True # noqa: F811 SILKY_PYTHON_PROFILER = True diff --git a/comic/feeds.py b/comic/feeds.py index 65b6f4e..62d75e4 100644 --- a/comic/feeds.py +++ b/comic/feeds.py @@ -1,6 +1,6 @@ from django.contrib.auth.models import User 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.shortcuts import get_object_or_404 @@ -18,7 +18,7 @@ class RecentComicsAPI(Feed): self.user = user_misc.user return user_misc.user - def items(self) -> ComicBook: + def items(self) -> QuerySet[ComicBook]: comics = ComicBook.objects.order_by("-date_added") comics = comics.annotate( classification=Case( diff --git a/comic/management/commands/scan_comics.py b/comic/management/commands/scan_comics.py index 16f7bb9..2d67800 100644 --- a/comic/management/commands/scan_comics.py +++ b/comic/management/commands/scan_comics.py @@ -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.models import User +from django.contrib.auth.base_user import AbstractBaseUser from django.core.management.base import BaseCommand, CommandParser from loguru import logger -from comic.models import ComicBook, Directory +from comic.models import Directory from comic.processing import generate_directory @@ -27,12 +27,11 @@ class Command(BaseCommand): self.OUTPUT = options.get('out', False) 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: user_model = get_user_model() - user = user_model.objects.first() + user: AbstractBaseUser = user_model.objects.first() for item in generate_directory(user, directory): - item: Union[Directory, ComicBook] - if item.type == 'Directory': + if item is Directory: logger.info(item) self.scan_directory(user, item) diff --git a/comic/processing.py b/comic/processing.py index bc8a3b9..dd9d750 100644 --- a/comic/processing.py +++ b/comic/processing.py @@ -6,7 +6,7 @@ from typing import NamedTuple, List, Optional, Union import rarfile 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, \ IntegerField @@ -14,7 +14,8 @@ from comic import models 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 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() -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()) files_db_set = set(Path(dir_path, x.file_name) for x in files) diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..e69de29 diff --git a/pyproject.toml b/pyproject.toml index 836d69a..41e32e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,43 +12,44 @@ license = "Creative Commons Attribution-ShareAlike 4.0 International License" python = "^3.10" Django = "^4.1" gunicorn = "^20.0.4" -dj-database-url = "^1.0.0" -python-dotenv = "^0.21.0" -loguru = "^0.6.0" +dj-database-url = "^1.3.0" +python-dotenv = "^1.0.0" +loguru = "^0.7.0" django-silk = "^5.0.0" mysqlclient = "^2.0.1" -psycopg2 = "^2.8.6" +psycopg2 = "^2.9.6" rarfile = "^4.0" django-extensions = "^3.2.1" Pillow = "^9.3.0" django-imagekit = "^4.0.2" PyMuPDF = "~1.20.2" -django-bootstrap4 = "^22.1" +django-bootstrap4 = "^23.1" django-csp = "^3.7" django-boost = "^2.1" django-sri = "^0.5.0" -django-permissions-policy = "^4.9.0" +django-permissions-policy = "^4.15.0" djangorestframework = "^3.13.1" -django-filter = "^22.1" -django-cors-headers = "^3.13.0" +django-filter = "^23.1" +django-cors-headers = "^3.14.0" djangorestframework-simplejwt = "^5.2.0" django-webpack-loader = "^1.6.0" drf-yasg = "^1.20.0" drf-extensions = "^0.7.1" [tool.poetry.dev-dependencies] -mypy = "^1.0.0" +mypy = "^1.2.0" Werkzeug = "^2.2" pyOpenSSL = "^22.0.0" -ipython = "^8.4.0" -coverage = "^7.1.0" -pre-commit = "^3.0.4" +ipython = "^8.12.0" +coverage = "^7.2.3" +pre-commit = "^3.2.2" flake8 = "^6.0.0" flake8-annotations = "^3.0.0" [tool.poetry.group.dev.dependencies] pylint = "^2.15.0" pylint-django = "^2.5.3" +mypy = "^1.2.0" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/requirements.txt b/requirements.txt index 9b4a227..3314585 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,25 +1,25 @@ 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" -beautifulsoup4==4.11.2 ; python_version >= "3.10" and python_version < "4.0" +autopep8==2.0.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" -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" 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" -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-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-cors-headers==3.13.0 ; 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.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-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-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-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==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==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" @@ -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" 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" -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" 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" -pillow==9.4.0 ; python_version >= "3.10" and python_version < "4.0" -psycopg2==2.9.5 ; 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.6 ; 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" 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" -pytz==2022.7.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==2023.3 ; 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" 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" -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" -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" 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" 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" win32-setctime==1.1.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32"