diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..4acbf9d --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,21 @@ +image: python:3.6 +services: + - postgres:latest +variables: + GIT_SUBMODULE_STRATEGY: normal + PIP_CACHE_DIR: $CI_PROJECT_DIR/.cache/pip + PIPENV_CACHE_DIR: $CI_PROJECT_DIR/.cache/pipenv + POSTGRES_HOST: postgres + POSTGRES_DB: nice_marmot + POSTGRES_USER: runner + POSTGRES_PASSWORD: '' + +cache: + paths: + - .cache + +test: + script: + - pip install pipenv + - pipenv sync --dev + - pipenv run pytest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..86a47d3 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,41 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: check-ast + - id: check-builtin-literals + - id: check-case-conflict + - id: check-docstring-first + - id: check-executables-have-shebangs + - id: check-json + - id: check-merge-conflict + - id: check-symlinks + - id: check-toml + - id: check-vcs-permalinks + - id: check-yaml + - id: destroyed-symlinks + - id: end-of-file-fixer + - id: fix-byte-order-marker + - id: mixed-line-ending + args: + - --fix=lf + - id: trailing-whitespace + - repo: https://github.com/psf/black + rev: 23.7.0 + hooks: + - id: black + language_version: python3.11 + - repo: local + hooks: + - id: pytest + name: Check pytest unit tests pass + entry: poetry run pytest + pass_filenames: false + language: system + types: [python] + - id: mypy + name: Check mypy static types match + entry: poetry run mypy . --ignore-missing-imports + pass_filenames: false + language: system + types: [python] diff --git a/.pyup.yml b/.pyup.yml new file mode 100644 index 0000000..98f8319 --- /dev/null +++ b/.pyup.yml @@ -0,0 +1,3 @@ +requirements: + - Pipfile + - Pipfile.lock diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..d551f1a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,16 @@ +language: python +cache: + directories: + - $PIP_CACHE_DIR + - $PIPENV_CACHE_DIR +env: + global: + - PIP_CACHE_DIR=$HOME/.cache/pip + - PIPENV_CACHE_DIR=$HOME/.cache/pipenv +python: + - '3.6' +install: + - pip install pipenv + - pipenv install --dev +script: + - pipenv run pytest diff --git a/Forwardfile b/Forwardfile new file mode 100644 index 0000000..784befe --- /dev/null +++ b/Forwardfile @@ -0,0 +1,4 @@ +# vim: set ft=yaml : +host: 00dani.dev +port: 443 +cname: dev.00dani.me diff --git a/LICENSE b/LICENSE index c28ac8d..f96fa75 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 - 2024 Danielle McLean +Copyright (c) 2017 - 2018 Danielle McLean Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/entries/pagination.py b/entries/pagination.py index 67d1897..aa7c174 100644 --- a/entries/pagination.py +++ b/entries/pagination.py @@ -1,32 +1,35 @@ -from typing import Callable - -from django.core.paginator import Page, Paginator +from django.core.paginator import Paginator from django.shortcuts import redirect from lemoncurry.middleware import ResponseException -def paginate(queryset, reverse: Callable[[int], str], page: int | None) -> Page: - def redirect_to_page(i: int): - raise ResponseException(redirect(reverse(i))) +def paginate(queryset, reverse, page): + class Page: + def __init__(self, i): + self.i = i - def reversible(p: Page) -> Page: - p.reverse = reverse - return p + @property + def url(self): + return reverse(self.i) + + @property + def current(self): + return self.i == entries.number + + # If the first page was requested, redirect to the clean version of the URL + # with no page suffix. + if page == 1: + raise ResponseException(redirect(Page(1).url)) paginator = Paginator(queryset, 10) + entries = paginator.page(page or 1) - # If no page number was specified, return page one. - if page is None: - return reversible(paginator.page(1)) + entries.pages = tuple(Page(i) for i in paginator.page_range) - # If the first page was explicitly requested, or the page number was negative, redirect to page one with no URL suffix. - if page <= 1: - redirect_to_page(1) + if entries.has_previous(): + entries.prev = Page(entries.previous_page_number()) + if entries.has_next(): + entries.next = Page(entries.next_page_number()) - # If the page requested is larger than the last page, then redirect to the last page. - if page > paginator.num_pages: - redirect_to_page(paginator.num_pages) - - # Just return the current page! Hooray! - return reversible(paginator.page(page)) + return entries diff --git a/lemoncurry/jinja2/lemoncurry/layout.html b/lemoncurry/jinja2/lemoncurry/layout.html index 322c461..22308c3 100644 --- a/lemoncurry/jinja2/lemoncurry/layout.html +++ b/lemoncurry/jinja2/lemoncurry/layout.html @@ -110,29 +110,29 @@