diff --git a/src/digimarks/main.py b/src/digimarks/main.py index ecd22cc..5c9e959 100644 --- a/src/digimarks/main.py +++ b/src/digimarks/main.py @@ -12,7 +12,6 @@ from urllib.parse import urljoin, urlparse, urlunparse import bs4 import httpx from dateutil import tz - from fastapi import FastAPI, HTTPException, Request, Response from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import HTMLResponse, RedirectResponse @@ -20,7 +19,6 @@ from fastapi.templating import Jinja2Templates from feedgen.feed import FeedGenerator from pydantic import DirectoryPath, FilePath from pydantic_settings import BaseSettings -from requests.exceptions import MissingSchema from sqlalchemy import VARCHAR, Boolean, Column, DateTime, Integer, Text, create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import Mapped, sessionmaker @@ -53,13 +51,15 @@ SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() + @asynccontextmanager async def lifespan(the_app: FastAPI): - """Upon start, initialise an AsyncClient and assign it to an attribute named requests_client on the app object""" + """Upon start, initialise an AsyncClient and assign it to an attribute named requests_client on the app object.""" the_app.requests_client = httpx.AsyncClient() yield await the_app.requests_client.aclose() + app = FastAPI(lifespan=lifespan) templates = Jinja2Templates(directory='templates') @@ -112,9 +112,9 @@ def unique_ever_seen(iterable, key=None): def clean_tags(tags_list): - """Generate unique list of the tags. + """Generate a unique list of the tags. - :param list tags_list: list with all tags + :param list tags_list: List with all tags :return: deduplicated list of the tags, without leading or trailing whitespace :rtype: list """ @@ -235,7 +235,9 @@ class Bookmark(Base): def set_status_code(self, request: Request) -> int: """Check the HTTP status of the url, as it might not exist for example.""" try: - result = request.app.requests_client.head(self.url, headers={'User-Agent': DIGIMARKS_USER_AGENT}, timeout=30) + result = request.app.requests_client.head( + self.url, headers={'User-Agent': DIGIMARKS_USER_AGENT}, timeout=30 + ) self.http_status = result.status_code except httpx.HTTPError as err: logger.error('Failed to do head info fetching for %s: %s', self.url, str(err)) @@ -434,9 +436,9 @@ def _find_bookmarks(user_key: str, filter_text) -> list[Bookmark]: .where( Bookmark.userkey == user_key, ( - Bookmark.title.contains(filter_text) - | Bookmark.url.contains(filter_text) - | Bookmark.note.contains(filter_text) + Bookmark.title.contains(filter_text) + | Bookmark.url.contains(filter_text) + | Bookmark.note.contains(filter_text) ), Bookmark.status == Bookmark.VISIBLE, ) @@ -513,7 +515,7 @@ def get_bookmarks(request: Request, user_key, filter_method=None, sort_method=No .order_by(Bookmark.created_date.desc()) ) - return bookmarks, bookmark_tags, filter_text #, message + return bookmarks, bookmark_tags, filter_text # , message @app.get('/{user_key}', response_class=HTMLResponse) @@ -659,7 +661,7 @@ def add_bookmark(request: Request, user_key: str): ) -def update_bookmark(request: Request, user_key: str, url_hash: str=None): +def update_bookmark(request: Request, user_key: str, url_hash: str = None): """Add (no urlhash) or edit (urlhash is set) a bookmark.""" title = request.form.get('title') url = request.form.get('url') @@ -988,7 +990,7 @@ def add_user(system_key): new_user.save() all_tags[new_user.key] = [] return {'user': f'/{new_user.key.decode("utf-8")}'} - raise HTTPException(status_code=404, detail='I can\'t let you do that Dave') + raise HTTPException(status_code=404, detail="I can't let you do that Dave") @app.route('//refreshfavicons') @@ -1005,7 +1007,7 @@ def refresh_favicons(system_key): print(e) bookmark.set_favicon() return {'message': 'Done refreshing icons'} - raise HTTPException(status_code=404, detail='I can\'t let you do that Dave') + raise HTTPException(status_code=404, detail="I can't let you do that Dave") @app.route('//findmissingfavicons') @@ -1016,7 +1018,7 @@ def find_missing_favicons(request: Request, system_key: str): for bookmark in bookmarks: try: if not bookmark.favicon or not os.path.isfile( - os.path.join(settings.media_dir, 'favicons', bookmark.favicon) + os.path.join(settings.media_dir, 'favicons', bookmark.favicon) ): # This favicon is missing # Clear favicon, so fallback can be used instead of showing a broken image @@ -1028,7 +1030,8 @@ def find_missing_favicons(request: Request, system_key: str): except OSError as e: print(e) return {'message': 'Done finding missing icons'} - raise HTTPException(status_code=404, detail='I can\'t let you do that Dave') + raise HTTPException(status_code=404, detail="I can't let you do that Dave") + # Initialisation == create the bookmark, user and public tag tables if they do not exist # TODO: switch to alembic migrations