diff --git a/.github/actions/docker-build/action.yml b/.github/actions/docker-build/action.yml deleted file mode 100644 index 1b59643d4..000000000 --- a/.github/actions/docker-build/action.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: Build Docker image - -inputs: - version: - required: true - type: string - latest: - required: false - type: boolean - default: false - github-token: - required: true - type: string - docker-image-name: - required: true - type: string - -runs: - using: "composite" - steps: - - uses: actions/checkout@v4 - - name: Log in to registry - run: echo "${{ inputs.github-token }}" | docker login ghcr.io -u $ --password-stdin - shell: bash - - uses: hadolint/hadolint-action@v3.1.0 - with: - dockerfile: Dockerfile - ignore: DL3045,DL3007 - - name: Build and push image - run: | - IMAGE_ID=$(echo "ghcr.io/${{ github.repository_owner }}/${{ inputs.docker-image-name }}" | tr '[A-Z]' '[a-z]') - echo "IMAGE_ID=$IMAGE_ID" >> "$GITHUB_OUTPUT" - echo $IMAGE_ID - docker build --tag $IMAGE_ID:${{ inputs.version }} --platform=linux/amd64 --no-cache . - docker push $IMAGE_ID:${{ inputs.version }} - shell: bash - - name: Tag latest - if: inputs.latest - run: | - IMAGE_ID=$(echo "ghcr.io/${{ github.repository_owner }}/${{ inputs.docker-image-name }}" | tr '[A-Z]' '[a-z]') - echo $IMAGE_ID - docker tag $IMAGE_ID:${{ inputs.version }} $IMAGE_ID:latest - docker push $IMAGE_ID:latest - shell: bash - - name: List all images - run: docker image ls - shell: bash - - name: List dangling images - run: docker images -f "dangling=true" - shell: bash - # - name: Remove untagged images - # run: docker rmi $(docker images -f "dangling=true" -q) - # shell: bash - # - name: Delete untagged images - # uses: actions/github-script@v6.3.3 - # with: - # github-token: ${{ inputs.github-token }} - # script: | - # const response = await github.request("GET /orgs/${{ github.repository_owner }}/packages/container/${{ IMAGE_ID }}/versions", - # { per_page: 100 - # }); - # for(version of response.data) { - # if (version.metadata.container.tags.length == 0 && version.name !== "latest" && version.name !== "preview") { - # console.log("Delete " + version.id) - - # const deleteResponse = await github.request("DELETE /orgs/${{ github.repository_owner }}/packages/container/${{ IMAGE_ID }}/versions/" + version.id, { }); - # console.log("status " + deleteResponse.status) - # } - # } diff --git a/.github/actions/get-version-tag/action.yml b/.github/actions/get-version-tag/action.yml deleted file mode 100644 index 4f3f29c5b..000000000 --- a/.github/actions/get-version-tag/action.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Get version tag - -outputs: - version-tag: - description: "Version tag" - value: ${{ steps.version-tag.outputs.VERSION }} - -runs: - using: "composite" - steps: - - id: version-tag - name: Get tag from branch, tag or release - run: | - VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') - # Strip "v" prefix from tag name - [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') - [ "$VERSION" == "main" ] && VERSION=develop - [ "$VERSION" == "develop" ] && VERSION=develop - echo "Version: $VERSION" - echo "VERSION=$VERSION" >> "$GITHUB_OUTPUT" - shell: bash diff --git a/.github/actions/install-aws/action.yml b/.github/actions/install-aws/action.yml deleted file mode 100644 index c08820edc..000000000 --- a/.github/actions/install-aws/action.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Set up AWS CLI - -inputs: - aws-access-key-id: - required: true - type: string - aws-secret-access-key: - required: true - type: string - -runs: - using: "composite" - steps: - - uses: actions/checkout@v4 - # - name: Install AWS CLI - # run: | - # curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" - # unzip awscliv2.zip - # ./aws/install --update - # aws --version - # shell: bash - - name: Configure AWS CLI - run: | - export AWS_ACCESS_KEY_ID=${{ inputs.aws-access-key-id }} - export AWS_SECRET_ACCESS_KEY=${{ inputs.aws-secret-access-key }} - aws configure --region eu-west-2 --output json - shell: bash diff --git a/.github/dependabot.yml b/.github/dependabot.yml index debcb65a0..1b16db535 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -18,11 +18,11 @@ updates: ignore: - dependency-name: "*" update-types: ["version-update:semver-patch"] - - package-ecosystem: "npm" - versioning-strategy: "widen" - directory: "/" - schedule: - interval: "weekly" - ignore: - - dependency-name: "*" - update-types: ["version-update:semver-patch"] + # - package-ecosystem: "npm" + # versioning-strategy: "widen" + # directory: "/" + # schedule: + # interval: "weekly" + # ignore: + # - dependency-name: "*" + # update-types: ["version-update:semver-patch"] diff --git a/.github/workflows/branch-cleanup.yml b/.github/workflows/branch-cleanup.yml index 51afb3292..17b405a6f 100644 --- a/.github/workflows/branch-cleanup.yml +++ b/.github/workflows/branch-cleanup.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@v4 - name: Get tag id: version-tag - uses: ./.github/actions/get-version-tag + run: echo "VERSION=$(echo "${{ github.event.ref }}" | sed -e 's,/,-,g')" >> "$GITHUB_OUTPUT" - name: Debug run: echo "Clean up Docker image ${{ vars.DOCKER_IMAGE_NAME }}:${{ steps.version-tag.outputs.VERSION }}" - name: Delete image diff --git a/.github/workflows/cd-feature.yml b/.github/workflows/cd-feature.yml deleted file mode 100644 index ed4cae69a..000000000 --- a/.github/workflows/cd-feature.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Deploy feature branch - -on: - workflow_dispatch: - # push: - # branches: - # - feature/* - -jobs: - deploy: - name: Deploy to AWS - runs-on: ubuntu-latest - permissions: - packages: write - contents: read - steps: - - uses: actions/checkout@v4 - - name: Get tag - id: version-tag - uses: ./.github/actions/get-version-tag - - name: Build Docker image - uses: ./.github/actions/docker-build - with: - version: ${{ steps.version-tag.outputs.version-tag }} # (feature/abc) - github-token: ${{ secrets.GITHUB_TOKEN }} - docker-image-name: ${{ vars.DOCKER_IMAGE_NAME }} - # - name: Install AWS CLI - # uses: ./.github/actions/install-aws - # with: - # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - # TODO: Deploy new feature environment diff --git a/.github/workflows/cd-main.yml b/.github/workflows/cd-main.yml deleted file mode 100644 index 4c9843752..000000000 --- a/.github/workflows/cd-main.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Continuous deployment to preview - -on: - # workflow_dispatch: - push: - branches: - - develop # TODO: Change to "main" if our working branch changes - -jobs: - deploy: - name: Deploy to AWS - runs-on: ubuntu-latest - permissions: - packages: write - contents: read - steps: - - uses: actions/checkout@v4 - - name: Get tag - id: version-tag - uses: ./.github/actions/get-version-tag - - name: Build Docker image - uses: ./.github/actions/docker-build - with: - version: ${{ steps.version-tag.outputs.version-tag }} # (develop) - latest: true - github-token: ${{ secrets.GITHUB_TOKEN }} - docker-image-name: ${{ vars.DOCKER_IMAGE_NAME }} - # - name: Install AWS CLI - # uses: ./.github/actions/install-aws - # with: - # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - # - name: Deploy to AWS - # run: aws ssm put-parameter --profile preview --name "/devops/private-beta/version" --type "String" --value "${{ steps.version-tag.outputs.VERSION }}" --overwrite diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 000000000..4df05ea72 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,47 @@ +name: Build and deploy + +on: + workflow_dispatch: + push: + release: + types: + - published + +concurrency: + group: cd-${{ github.ref }} + +jobs: + test: + name: Tests + uses: ./.github/workflows/_tests.yml + with: + python-version: ${{ vars.CI_PYTHON_VERSION }} + poetry-version: ${{ vars.CI_POETRY_VERSION }} + + version: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Get tag + id: version-tag + uses: nationalarchives/ds-docker-actions/.github/actions/get-version-tag@main + outputs: + version: ${{ steps.version-tag.outputs.version-tag }} + + build: + runs-on: ubuntu-latest + needs: + - test + - version + permissions: + packages: write + contents: read + steps: + - uses: actions/checkout@v4 + - name: Build Docker image + uses: nationalarchives/ds-docker-actions/.github/actions/docker-build@main + with: + version: ${{ needs.version.outputs.version }} + latest: ${{ github.ref == 'refs/heads/main' }} + github-token: ${{ secrets.GITHUB_TOKEN }} + docker-image-name: ${{ vars.DOCKER_IMAGE_NAME }} diff --git a/.github/workflows/ci.yml b/.github/workflows/pr.yml similarity index 75% rename from .github/workflows/ci.yml rename to .github/workflows/pr.yml index 1d18ad1e2..f16a6e301 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/pr.yml @@ -1,7 +1,10 @@ -name: CI +name: Pull request on: pull_request: + types: + - opened + - synchronize jobs: ci: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index d8e05776c..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Release to staging - -on: - release: - types: - - published - -jobs: - build: - name: Build and deploy to AWS - runs-on: ubuntu-latest - permissions: - packages: write - contents: read - steps: - - uses: actions/checkout@v4 - - name: Get tag - id: version-tag - uses: ./.github/actions/get-version-tag - - name: Build - uses: ./.github/actions/docker-build - with: - version: ${{ steps.version-tag.outputs.version-tag }} # (e.g. 23.09.24.1) - github-token: ${{ secrets.GITHUB_TOKEN }} - docker-image-name: ${{ vars.DOCKER_IMAGE_NAME }} - # - name: Install AWS CLI - # uses: ./.github/actions/install-aws - # with: - # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - # - name: Deploy to AWS - # run: aws ssm put-parameter --profile staging --name "/devops/private-beta/version" --type "String" --value "${{ steps.version-tag.outputs.VERSION }}" --overwrite diff --git a/.github/workflows/remove-untagged.yml b/.github/workflows/remove-untagged.yml deleted file mode 100644 index afcd500ba..000000000 --- a/.github/workflows/remove-untagged.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Remove untagged container images - -on: - workflow_dispatch: - # schedule: - # - cron: "0 3 * * 1" - -jobs: - remove-untagged: - runs-on: ubuntu-latest - env: - PER_PAGE: 100 - steps: - - name: Delete untagged images - uses: actions/github-script@v7.0.1 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const response = await github.request("GET /orgs/${{ github.repository_owner }}/packages/container/${{ vars.DOCKER_IMAGE_NAME }}/versions", - { per_page: ${{ env.PER_PAGE }} - }); - for(version of response.data) { - if (version.metadata.container.tags.length == 0 && version.name !== "latest" && version.name !== "preview") { - console.log("Delete " + version.id) - - // const deleteResponse = await github.request("DELETE /orgs/${{ github.repository_owner }}/packages/container/${{ vars.DOCKER_IMAGE_NAME }}/versions/" + version.id, { }); - // console.log("status " + deleteResponse.status) - } - } \ No newline at end of file diff --git a/config/settings/base.py b/config/settings/base.py index ef108b77b..d4005882c 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -27,11 +27,15 @@ WAGTAILAPI_BASE_URL = os.getenv("WAGTAILAPI_BASE_URL", "") WAGTAIL_HEADLESS_PREVIEW = { "CLIENT_URLS": { - "default": "{SITE_ROOT_URL}", + "default": os.getenv("WAGTAILADMIN_HEADLESS_PREVIEW_URL", "{SITE_ROOT_URL}"), }, - "SERVE_BASE_URL": None, # can be used for HeadlessServeMixin - "REDIRECT_ON_PREVIEW": False, # set to True to redirect to the preview instead of using the Wagtail default mechanism - "ENFORCE_TRAILING_SLASH": True, # set to False in order to disable the trailing slash enforcement + "SERVE_BASE_URL": os.getenv("WAGTAILADMIN_HEADLESS_BASE_URL", None), + "REDIRECT_ON_PREVIEW": strtobool( + os.getenv("WAGTAILADMIN_HEADLESS_REDIRECT_ON_PREVIEW", "False") + ), + "ENFORCE_TRAILING_SLASH": strtobool( + os.getenv("WAGTAILADMIN_HEADLESS_ENFORCE_TRAILING_SLASH", "True") + ), } DEBUG = strtobool(os.getenv("DEBUG", "False")) diff --git a/config/settings/dev.py b/config/settings/dev.py index deb1eecf7..49e704e9d 100644 --- a/config/settings/dev.py +++ b/config/settings/dev.py @@ -13,9 +13,19 @@ WAGTAILADMIN_BASE_URL = os.getenv("WAGTAILADMIN_BASE_URL", "http://localhost:8000") WAGTAIL_HEADLESS_PREVIEW = { "CLIENT_URLS": { - "default": "http://localhost:65535/preview", + "default": os.getenv( + "WAGTAILADMIN_HEADLESS_PREVIEW_URL", "http://localhost:65535/preview" + ), }, - "SERVE_BASE_URL": "http://localhost:65535", + "SERVE_BASE_URL": os.getenv( + "WAGTAILADMIN_HEADLESS_BASE_URL", "http://localhost:65535" + ), + "REDIRECT_ON_PREVIEW": strtobool( + os.getenv("WAGTAILADMIN_HEADLESS_REDIRECT_ON_PREVIEW", "False") + ), + "ENFORCE_TRAILING_SLASH": strtobool( + os.getenv("WAGTAILADMIN_HEADLESS_ENFORCE_TRAILING_SLASH", "True") + ), } # SECURITY WARNING: keep the secret key used in production secret! diff --git a/config/settings/platform.py b/config/settings/platform.py index fb17d1a19..d212611b8 100644 --- a/config/settings/platform.py +++ b/config/settings/platform.py @@ -1,5 +1,3 @@ -from urllib.parse import urlparse - from platformshconfig import Config from platformshconfig.config import ( BuildTimeVariableAccessException, @@ -13,9 +11,7 @@ SECRET_KEY = config.projectEntropy try: - ALLOWED_HOSTS = [ - urlparse(url).netloc for url in config.get_upstream_routes().keys() - ] + ALLOWED_HOSTS = ["*"] except BuildTimeVariableAccessException: # Routes aren't available during build-time. Unfortunately, this file needs # to be accessed during collectstatic diff --git a/etna/api/tests/expected_results/article.json b/etna/api/tests/expected_results/article.json index aaaf9ab57..abd71d46b 100644 --- a/etna/api/tests/expected_results/article.json +++ b/etna/api/tests/expected_results/article.json @@ -18,7 +18,10 @@ "html_url": "http://localhost/article_index/" }, "title": "article_index" - } + }, + "privacy": "public", + "last_published_at": "2000-01-01T00:00:00Z", + "url": "/article_index/article/" }, "title": "article", "type_label": "The story of", @@ -33,28 +36,12 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", "width": 100, "height": 68 } }, - "teaser_image_large": { - "id": 12, - "title": "An image", - "jpeg": { - "url": "/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_iG2hIxi.jpg", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_iG2hIxi.jpg", - "width": 100, - "height": 40 - }, - "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_15rF74p.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_15rF74p.webp", - "width": 100, - "height": 40 - } - }, "teaser_image_square": { "id": 12, "title": "An image", @@ -65,8 +52,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_8zcBeAq.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_8zcBeAq.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_8zcBeAq.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_8zcBeAq.webp", "width": 100, "height": 100 } @@ -85,8 +72,8 @@ "height": 40 }, "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_xM6LhM0.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_xM6LhM0.webp", + "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_xM6LhM0.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_xM6LhM0.webp", "width": 100, "height": 40 } @@ -101,8 +88,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_BEZm7Hv.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_BEZm7Hv.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_BEZm7Hv.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_BEZm7Hv.webp", "width": 100, "height": 68 } @@ -154,8 +141,8 @@ "height": 100 }, "webp": { - "url": "/media/images/example_0Tm3K5n.max-900x900.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/example_0Tm3K5n.max-900x900.format-webp.webpquality-80.webp", + "url": "/media/images/example_0Tm3K5n.max-900x900.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/example_0Tm3K5n.max-900x900.format-webp.webpquality-60.webp", "width": 100, "height": 100 }, @@ -190,8 +177,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_GupD5Qb.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_GupD5Qb.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_GupD5Qb.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_GupD5Qb.webp", "width": 100, "height": 68 }, @@ -227,7 +214,7 @@ { "type": "featured_record_article", "value": { - "page": {} + "page": null }, "id": "b505f636-f3d1-4d4b-b368-69183e324e6e" }, @@ -253,8 +240,8 @@ "height": 100 }, "webp": { - "url": "/media/images/example_0Tm3K5n.max-900x900.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/example_0Tm3K5n.max-900x900.format-webp.webpquality-80.webp", + "url": "/media/images/example_0Tm3K5n.max-900x900.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/example_0Tm3K5n.max-900x900.format-webp.webpquality-60.webp", "width": 100, "height": 100 }, @@ -315,8 +302,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_moF3lTy.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_moF3lTy.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_moF3lTy.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_moF3lTy.webp", "width": 100, "height": 68 } @@ -331,7 +318,7 @@ "title": "arts", "url": "/arts/", "full_url": "http://localhost/arts/", - "type_label": "Explore by topic", + "type_label": "Topic", "teaser_text": "Teaser text", "teaser_image": { "id": 2, @@ -343,8 +330,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_EW7Ow5o.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_EW7Ow5o.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_EW7Ow5o.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_EW7Ow5o.webp", "width": 100, "height": 68 } @@ -357,7 +344,7 @@ "title": "early_modern", "url": "/early_modern/", "full_url": "http://localhost/early_modern/", - "type_label": "Explore by time period", + "type_label": "Time period", "teaser_text": "Teaser text", "teaser_image": { "id": 4, @@ -369,8 +356,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_hHTWoNv.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_hHTWoNv.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_hHTWoNv.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_hHTWoNv.webp", "width": 100, "height": 68 } @@ -381,7 +368,7 @@ "title": "postwar", "url": "/postwar/", "full_url": "http://localhost/postwar/", - "type_label": "Explore by time period", + "type_label": "Time period", "teaser_text": "Teaser text", "teaser_image": { "id": 6, @@ -393,8 +380,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_yuGViLV.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_yuGViLV.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_yuGViLV.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_yuGViLV.webp", "width": 100, "height": 68 } diff --git a/etna/api/tests/expected_results/article_index.json b/etna/api/tests/expected_results/article_index.json index 385c2fcf8..7cb45bdbe 100644 --- a/etna/api/tests/expected_results/article_index.json +++ b/etna/api/tests/expected_results/article_index.json @@ -18,7 +18,10 @@ "html_url": "http://localhost/" }, "title": "Home" - } + }, + "privacy": "public", + "last_published_at": "2000-01-01T00:00:00Z", + "url": "/article_index/" }, "title": "article_index", "type_label": "Article index", @@ -33,28 +36,12 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_7hLyRgB.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_7hLyRgB.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_7hLyRgB.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_7hLyRgB.webp", "width": 100, "height": 68 } }, - "teaser_image_large": { - "id": 11, - "title": "An image", - "jpeg": { - "url": "/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_NwigGNI.jpg", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_NwigGNI.jpg", - "width": 100, - "height": 40 - }, - "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_HpAlGCn.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_HpAlGCn.webp", - "width": 100, - "height": 40 - } - }, "teaser_image_square": { "id": 11, "title": "An image", @@ -65,8 +52,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_ppQbvU2.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_ppQbvU2.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_ppQbvU2.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_ppQbvU2.webp", "width": 100, "height": 100 } @@ -91,8 +78,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -123,8 +110,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -148,8 +135,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } diff --git a/etna/api/tests/expected_results/arts.json b/etna/api/tests/expected_results/arts.json index 82004292b..f9351605e 100644 --- a/etna/api/tests/expected_results/arts.json +++ b/etna/api/tests/expected_results/arts.json @@ -18,7 +18,10 @@ "html_url": "http://localhost/" }, "title": "Home" - } + }, + "privacy": "public", + "last_published_at": "2000-01-01T00:00:00Z", + "url": "/arts/" }, "title": "arts", "hero_image_caption": "
Hero image caption
", @@ -32,8 +35,8 @@ "height": 40 }, "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_JdNZ8pq.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_JdNZ8pq.webp", + "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_JdNZ8pq.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_JdNZ8pq.webp", "width": 100, "height": 40 } @@ -48,14 +51,14 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_m1Symmo.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_m1Symmo.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_m1Symmo.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_m1Symmo.webp", "width": 100, "height": 68 } }, "alert": null, - "type_label": "Explore by topic", + "type_label": "Topic", "teaser_text": "Teaser text", "teaser_image": { "id": 2, @@ -67,28 +70,12 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_EW7Ow5o.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_EW7Ow5o.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_EW7Ow5o.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_EW7Ow5o.webp", "width": 100, "height": 68 } }, - "teaser_image_large": { - "id": 2, - "title": "An image", - "jpeg": { - "url": "/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_KA7WZJi.jpg", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_KA7WZJi.jpg", - "width": 100, - "height": 40 - }, - "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_GIgFPMR.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_GIgFPMR.webp", - "width": 100, - "height": 40 - } - }, "teaser_image_square": { "id": 2, "title": "An image", @@ -99,8 +86,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_iIlAHIz.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_iIlAHIz.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_iIlAHIz.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_iIlAHIz.webp", "width": 100, "height": 100 } @@ -129,8 +116,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_moF3lTy.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_moF3lTy.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_moF3lTy.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_moF3lTy.webp", "width": 100, "height": 68 } @@ -154,8 +141,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", "width": 100, "height": 68 } @@ -181,8 +168,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_zRNQgeA.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_zRNQgeA.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_zRNQgeA.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_zRNQgeA.webp", "width": 100, "height": 68 } diff --git a/etna/api/tests/expected_results/author.json b/etna/api/tests/expected_results/author.json index 660c95613..7d4a5b4a0 100644 --- a/etna/api/tests/expected_results/author.json +++ b/etna/api/tests/expected_results/author.json @@ -18,7 +18,10 @@ "html_url": "http://localhost/authors/" }, "title": "authors" - } + }, + "privacy": "public", + "last_published_at": "2000-01-01T00:00:00Z", + "url": "/authors/author/" }, "title": "author", "type_label": "Author", @@ -33,28 +36,12 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_ljNBufq.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_ljNBufq.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_ljNBufq.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_ljNBufq.webp", "width": 100, "height": 68 } }, - "teaser_image_large": { - "id": 10, - "title": "An image", - "jpeg": { - "url": "/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_UkpcToZ.jpg", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_UkpcToZ.jpg", - "width": 100, - "height": 40 - }, - "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_ZHjzsGF.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_ZHjzsGF.webp", - "width": 100, - "height": 40 - } - }, "teaser_image_square": { "id": 10, "title": "An image", @@ -65,8 +52,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_g9tHw4i.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_g9tHw4i.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_g9tHw4i.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_g9tHw4i.webp", "width": 100, "height": 100 } @@ -93,8 +80,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -112,8 +99,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_nJ9965Y.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_nJ9965Y.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_nJ9965Y.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_nJ9965Y.webp", "width": 100, "height": 100 } @@ -128,8 +115,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-80_WHn2XPR.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-80_WHn2XPR.webp", + "url": "/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-60_WHn2XPR.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-60_WHn2XPR.webp", "width": 100, "height": 100 } diff --git a/etna/api/tests/expected_results/authors.json b/etna/api/tests/expected_results/authors.json index 14da62576..a866b61f1 100644 --- a/etna/api/tests/expected_results/authors.json +++ b/etna/api/tests/expected_results/authors.json @@ -18,7 +18,10 @@ "html_url": "http://localhost/" }, "title": "Home" - } + }, + "privacy": "public", + "last_published_at": null, + "url": "/authors/" }, "title": "authors", "type_label": "Author index", @@ -33,28 +36,12 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_28UNLbC.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_28UNLbC.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_28UNLbC.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_28UNLbC.webp", "width": 100, "height": 68 } }, - "teaser_image_large": { - "id": 8, - "title": "An image", - "jpeg": { - "url": "/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_ezPcrol.jpg", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_ezPcrol.jpg", - "width": 100, - "height": 40 - }, - "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_UAsVaAN.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_UAsVaAN.webp", - "width": 100, - "height": 40 - } - }, "teaser_image_square": { "id": 8, "title": "An image", @@ -65,8 +52,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_52SwDTo.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_52SwDTo.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_52SwDTo.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_52SwDTo.webp", "width": 100, "height": 100 } @@ -91,8 +78,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -108,8 +95,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60.webp", "width": 100, "height": 100 } @@ -124,8 +111,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-60.webp", "width": 100, "height": 100 } diff --git a/etna/api/tests/expected_results/early_modern.json b/etna/api/tests/expected_results/early_modern.json index e1f78a557..5ce755ab6 100644 --- a/etna/api/tests/expected_results/early_modern.json +++ b/etna/api/tests/expected_results/early_modern.json @@ -18,7 +18,10 @@ "html_url": "http://localhost/" }, "title": "Home" - } + }, + "privacy": "public", + "last_published_at": "2000-01-01T00:00:00Z", + "url": "/early_modern/" }, "title": "early_modern", "hero_image_caption": "Hero image caption
", @@ -32,8 +35,8 @@ "height": 40 }, "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_VQVfGTV.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_VQVfGTV.webp", + "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_VQVfGTV.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_VQVfGTV.webp", "width": 100, "height": 40 } @@ -48,14 +51,14 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_XBKOSWE.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_XBKOSWE.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_XBKOSWE.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_XBKOSWE.webp", "width": 100, "height": 68 } }, "alert": null, - "type_label": "Explore by time period", + "type_label": "Time period", "teaser_text": "Teaser text", "teaser_image": { "id": 4, @@ -67,28 +70,12 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_hHTWoNv.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_hHTWoNv.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_hHTWoNv.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_hHTWoNv.webp", "width": 100, "height": 68 } }, - "teaser_image_large": { - "id": 4, - "title": "An image", - "jpeg": { - "url": "/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_0pS7i14.jpg", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_0pS7i14.jpg", - "width": 100, - "height": 40 - }, - "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_a3GVmkk.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_a3GVmkk.webp", - "width": 100, - "height": 40 - } - }, "teaser_image_square": { "id": 4, "title": "An image", @@ -99,8 +86,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_NJOgycO.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_NJOgycO.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_NJOgycO.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_NJOgycO.webp", "width": 100, "height": 100 } @@ -128,8 +115,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_moF3lTy.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_moF3lTy.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_moF3lTy.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_moF3lTy.webp", "width": 100, "height": 68 } @@ -153,8 +140,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", "width": 100, "height": 68 } @@ -180,8 +167,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_zRNQgeA.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_zRNQgeA.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_zRNQgeA.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_zRNQgeA.webp", "width": 100, "height": 68 } diff --git a/etna/api/tests/expected_results/focused_article.json b/etna/api/tests/expected_results/focused_article.json index 820766cdf..c92d52c20 100644 --- a/etna/api/tests/expected_results/focused_article.json +++ b/etna/api/tests/expected_results/focused_article.json @@ -18,7 +18,10 @@ "html_url": "http://localhost/article_index/" }, "title": "article_index" - } + }, + "privacy": "public", + "last_published_at": "2000-01-02T00:00:00Z", + "url": "/article_index/focused_article/" }, "title": "focused_article", "type_label": "Focus on", @@ -33,28 +36,12 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_moF3lTy.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_moF3lTy.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_moF3lTy.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_moF3lTy.webp", "width": 100, "height": 68 } }, - "teaser_image_large": { - "id": 14, - "title": "An image", - "jpeg": { - "url": "/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_Z4wdWCW.jpg", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_Z4wdWCW.jpg", - "width": 100, - "height": 40 - }, - "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_Fh5slYL.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_Fh5slYL.webp", - "width": 100, - "height": 40 - } - }, "teaser_image_square": { "id": 14, "title": "An image", @@ -65,8 +52,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_5hj4CDl.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_5hj4CDl.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_5hj4CDl.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_5hj4CDl.webp", "width": 100, "height": 100 } @@ -85,8 +72,8 @@ "height": 40 }, "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_mfg9Hat.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_mfg9Hat.webp", + "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_mfg9Hat.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_mfg9Hat.webp", "width": 100, "height": 40 } @@ -101,8 +88,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_bj9aWVy.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_bj9aWVy.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_bj9aWVy.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_bj9aWVy.webp", "width": 100, "height": 68 } @@ -133,8 +120,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", "width": 100, "height": 68 } @@ -149,7 +136,7 @@ "title": "arts", "url": "/arts/", "full_url": "http://localhost/arts/", - "type_label": "Explore by topic", + "type_label": "Topic", "teaser_text": "Teaser text", "teaser_image": { "id": 2, @@ -161,8 +148,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_EW7Ow5o.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_EW7Ow5o.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_EW7Ow5o.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_EW7Ow5o.webp", "width": 100, "height": 68 } @@ -175,7 +162,7 @@ "title": "early_modern", "url": "/early_modern/", "full_url": "http://localhost/early_modern/", - "type_label": "Explore by time period", + "type_label": "Time period", "teaser_text": "Teaser text", "teaser_image": { "id": 4, @@ -187,8 +174,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_hHTWoNv.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_hHTWoNv.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_hHTWoNv.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_hHTWoNv.webp", "width": 100, "height": 68 } @@ -213,8 +200,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -230,8 +217,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_d2IUyJ1.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_d2IUyJ1.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_d2IUyJ1.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_d2IUyJ1.webp", "width": 100, "height": 100 } @@ -246,8 +233,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-80_igefotD.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-80_igefotD.webp", + "url": "/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-60_igefotD.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-60_igefotD.webp", "width": 100, "height": 100 } diff --git a/etna/api/tests/expected_results/highlight_gallery.json b/etna/api/tests/expected_results/highlight_gallery.json index 2953a4c07..5b6c28969 100644 --- a/etna/api/tests/expected_results/highlight_gallery.json +++ b/etna/api/tests/expected_results/highlight_gallery.json @@ -18,7 +18,10 @@ "html_url": "http://localhost/arts/" }, "title": "arts" - } + }, + "privacy": "public", + "last_published_at": "2000-01-03T00:00:00Z", + "url": "/arts/highlight_gallery/" }, "title": "highlight_gallery", "type_label": "In pictures", @@ -33,28 +36,12 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_zRNQgeA.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_zRNQgeA.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_zRNQgeA.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_zRNQgeA.webp", "width": 100, "height": 68 } }, - "teaser_image_large": { - "id": 16, - "title": "An image", - "jpeg": { - "url": "/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_t8sn6ar.jpg", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_t8sn6ar.jpg", - "width": 100, - "height": 40 - }, - "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_xfOqzM7.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_xfOqzM7.webp", - "width": 100, - "height": 40 - } - }, "teaser_image_square": { "id": 16, "title": "An image", @@ -65,8 +52,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_4qVjMdZ.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_4qVjMdZ.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_4qVjMdZ.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_4qVjMdZ.webp", "width": 100, "height": 100 } @@ -93,8 +80,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", "width": 100, "height": 68 } @@ -113,14 +100,8 @@ "height": 100 }, "webp": { - "url": "/media/images/example_E1PUN8.max-1024x1024.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/example_E1PUN8.max-1024x1024.format-webp.webpquality-80.webp", - "width": 100, - "height": 100 - }, - "png": { - "url": "/media/images/example.max-1024x1024.format-png.png", - "full_url": "https://nationalarchives.gov.uk/media/images/example.max-1024x1024.format-png.png", + "url": "/media/images/example_E1PUN8.max-1024x1024.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/example_E1PUN8.max-1024x1024.format-webp.webpquality-60.webp", "width": 100, "height": 100 }, @@ -154,8 +135,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -169,7 +150,7 @@ "title": "arts", "url": "/arts/", "full_url": "http://localhost/arts/", - "type_label": "Explore by topic", + "type_label": "Topic", "teaser_text": "Teaser text", "teaser_image": { "id": 2, @@ -181,8 +162,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_EW7Ow5o.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_EW7Ow5o.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_EW7Ow5o.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_EW7Ow5o.webp", "width": 100, "height": 68 } @@ -195,7 +176,7 @@ "title": "early_modern", "url": "/early_modern/", "full_url": "http://localhost/early_modern/", - "type_label": "Explore by time period", + "type_label": "Time period", "teaser_text": "Teaser text", "teaser_image": { "id": 4, @@ -207,8 +188,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_hHTWoNv.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_hHTWoNv.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_hHTWoNv.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_hHTWoNv.webp", "width": 100, "height": 68 } diff --git a/etna/api/tests/expected_results/pages.json b/etna/api/tests/expected_results/pages.json index 32125de47..edd33c22b 100644 --- a/etna/api/tests/expected_results/pages.json +++ b/etna/api/tests/expected_results/pages.json @@ -17,7 +17,7 @@ "title": "arts", "url": "/arts/", "full_url": "http://localhost/arts/", - "type_label": "Explore by topic", + "type_label": "Topic", "teaser_text": "Teaser text", "teaser_image": { "id": 2, @@ -29,8 +29,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -53,8 +53,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -66,7 +66,7 @@ "title": "early_modern", "url": "/early_modern/", "full_url": "http://localhost/early_modern/", - "type_label": "Explore by time period", + "type_label": "Time period", "teaser_text": "Teaser text", "teaser_image": { "id": 4, @@ -78,8 +78,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -90,7 +90,7 @@ "title": "postwar", "url": "/postwar/", "full_url": "http://localhost/postwar/", - "type_label": "Explore by time period", + "type_label": "Time period", "teaser_text": "Teaser text", "teaser_image": { "id": 6, @@ -102,8 +102,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -126,8 +126,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -150,8 +150,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -167,8 +167,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60.webp", "width": 100, "height": 100 } @@ -183,8 +183,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-128x128.format-webp.webpquality-60.webp", "width": 100, "height": 100 } @@ -207,8 +207,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -231,8 +231,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } @@ -256,8 +256,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60.webp", "width": 100, "height": 68 } diff --git a/etna/api/tests/expected_results/postwar.json b/etna/api/tests/expected_results/postwar.json index 8c319d5c6..e0c51b77d 100644 --- a/etna/api/tests/expected_results/postwar.json +++ b/etna/api/tests/expected_results/postwar.json @@ -18,7 +18,10 @@ "html_url": "http://localhost/" }, "title": "Home" - } + }, + "privacy": "public", + "last_published_at": "2000-01-01T00:00:00Z", + "url": "/postwar/" }, "title": "postwar", "hero_image_caption": "Hero image caption
", @@ -32,8 +35,8 @@ "height": 40 }, "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_oHYAsUO.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_oHYAsUO.webp", + "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_oHYAsUO.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-60_oHYAsUO.webp", "width": 100, "height": 40 } @@ -48,14 +51,14 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_ls5YpjY.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_ls5YpjY.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_ls5YpjY.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_ls5YpjY.webp", "width": 100, "height": 68 } }, "alert": null, - "type_label": "Explore by time period", + "type_label": "Time period", "teaser_text": "Teaser text", "teaser_image": { "id": 6, @@ -67,28 +70,12 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_yuGViLV.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_yuGViLV.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_yuGViLV.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_yuGViLV.webp", "width": 100, "height": 68 } }, - "teaser_image_large": { - "id": 6, - "title": "An image", - "jpeg": { - "url": "/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_C6if4E3.jpg", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-1200x480.format-jpeg.jpegquality-60_C6if4E3.jpg", - "width": 100, - "height": 40 - }, - "webp": { - "url": "/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_SD5KpRM.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/examp.2e16d0ba.fill-1200x480.format-webp.webpquality-80_SD5KpRM.webp", - "width": 100, - "height": 40 - } - }, "teaser_image_square": { "id": 6, "title": "An image", @@ -99,8 +86,8 @@ "height": 100 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_iXmD76N.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-80_iXmD76N.webp", + "url": "/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_iXmD76N.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-512x512.format-webp.webpquality-60_iXmD76N.webp", "width": 100, "height": 100 } @@ -128,8 +115,8 @@ "height": 68 }, "webp": { - "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", - "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-80_q1PKELE.webp", + "url": "/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", + "full_url": "https://nationalarchives.gov.uk/media/images/exampl.2e16d0ba.fill-600x400.format-webp.webpquality-60_q1PKELE.webp", "width": 100, "height": 68 } diff --git a/etna/api/urls.py b/etna/api/urls.py index a741fb320..87a954f86 100644 --- a/etna/api/urls.py +++ b/etna/api/urls.py @@ -1,15 +1,172 @@ +import logging + +from django.conf import settings from django.contrib.contenttypes.models import ContentType +from django.db.models import Q +from django.http import Http404 +from django.utils.crypto import constant_time_compare from wagtail.api.v2.router import WagtailAPIRouter +from wagtail.api.v2.utils import BadRequestError from wagtail.api.v2.views import PagesAPIViewSet +from wagtail.contrib.redirects.models import Redirect from wagtail.images.api.v2.views import ImagesAPIViewSet +from wagtail.models import Page, PageViewRestriction, Site +from rest_framework import status from rest_framework.response import Response from wagtail_headless_preview.models import PagePreview from wagtailmedia.api.views import MediaAPIViewSet from etna.core.serializers.pages import DefaultPageSerializer +logger = logging.getLogger(__name__) + + +class CustomPagesAPIViewSet(PagesAPIViewSet): + known_query_parameters = PagesAPIViewSet.known_query_parameters.union(["password"]) + + def listing_view(self, request): + queryset = self.get_queryset() + + # Exclude pages that the user doesn't have access to + restricted_pages = [ + restriction.page + for restriction in PageViewRestriction.objects.all().select_related("page") + if not restriction.accept_request(self.request) + ] + + # Exclude the restricted pages and their descendants from the queryset + for restricted_page in restricted_pages: + queryset = queryset.not_descendant_of(restricted_page, inclusive=True) + + self.check_query_parameters(queryset) + queryset = self.filter_queryset(queryset) + queryset = self.paginate_queryset(queryset) + serializer = DefaultPageSerializer(queryset, many=True) + return self.get_paginated_response(serializer.data) + + def detail_view(self, request, pk): + instance = self.get_object() + restrictions = instance.get_view_restrictions() + serializer = self.get_serializer(instance) + data = serializer.data + if not restrictions: + return Response(data) + restricted_data = { + "id": data["id"], + "meta": {"privacy": data["meta"]["privacy"], "locked": True}, + } + for restriction in restrictions: + if restriction.restriction_type == PageViewRestriction.PASSWORD: + if "password" in request.GET: + if constant_time_compare( + request.GET["password"], restriction.password + ): + return Response(data) + else: + data = restricted_data | {"message": "Incorrect password."} + return Response(data) + else: + data = restricted_data | { + "message": "Password required to view this resource.", + } + return Response(data) + data = restricted_data | { + "message": "Selected privacy mode is not compatible with this API.", + } + return Response(data, status=status.HTTP_403_FORBIDDEN) + + def get_base_queryset(self): + """ + Copy of https://github.com/wagtail/wagtail/blob/f5552c40442b0ed6a0316ee899c7f28a0b1ed4e5/wagtail/api/v2/views.py#L491 + that doesn't remove restricted pages + """ + + request = self.request + + # Get all live pages + queryset = Page.objects.all().live() + + # Check if we have a specific site to look for + if "site" in request.GET: + # Optionally allow querying by port + if ":" in request.GET["site"]: + (hostname, port) = request.GET["site"].split(":", 1) + query = { + "hostname": hostname, + "port": port, + } + else: + query = { + "hostname": request.GET["site"], + } + try: + site = Site.objects.get(**query) + except Site.MultipleObjectsReturned: + raise BadRequestError( + "Your query returned multiple sites. Try adding a port number to your site filter." + ) + else: + # Otherwise, find the site from the request + site = Site.find_for_request(self.request) + + if site: + base_queryset = queryset + queryset = base_queryset.descendant_of(site.root_page, inclusive=True) + + # If internationalisation is enabled, include pages from other language trees + if getattr(settings, "WAGTAIL_I18N_ENABLED", False): + for translation in site.root_page.get_translations(): + queryset |= base_queryset.descendant_of(translation, inclusive=True) + + else: + # No sites configured + queryset = queryset.none() + + return queryset + + meta_fields = PagesAPIViewSet.meta_fields + [ + "privacy", + "last_published_at", + "url", + ] + + def find_object(self, queryset, request): + site = Site.find_for_request(request) + if "html_path" in request.GET and site is not None: + path = request.GET["html_path"] + + redirect_queryset = Redirect.objects.all() + redirects = redirect_queryset.filter( + Q(old_path=path) + | Q(old_path=path.strip("/")) + | Q(old_path=f"/{path.strip('/')}") + | Q(old_path=f"{path.strip('/')}/") + | Q(old_path=f"/{path.strip('/')}/") + ) + if redirects.exists(): + if redirects.get().redirect_page: + if new_path := redirects.get().redirect_page.url: + logger.info(f"Redirect detected: {path} ---> {new_path}") + path = new_path + # elif redirects.get().redirect_link: + # if new_path := redirects.get().redirect_link: + # logger.info(f"Redirect detected: {path} ---> {new_path}") + # path = new_path + + path_components = [component for component in path.split("/") if component] + + try: + page, _, _ = site.root_page.specific.route(request, path_components) + except Http404: + return + + if queryset.filter(id=page.id).exists(): + return page + + return super().find_object(queryset, request) + class PagePreviewAPIViewSet(PagesAPIViewSet): known_query_parameters = PagesAPIViewSet.known_query_parameters.union( @@ -27,6 +184,11 @@ def detail_view(self, request, pk): return Response(serializer.data) def get_object(self): + if "content_type" not in self.request.GET: + raise BadRequestError("content_type not specified") + if "token" not in self.request.GET: + raise BadRequestError("token not specified") + app_label, model = self.request.GET["content_type"].split(".") content_type = ContentType.objects.get(app_label=app_label, model=model) @@ -59,19 +221,9 @@ class CustomImagesAPIViewSet(ImagesAPIViewSet): ] -class CustomPagesAPIViewSet(PagesAPIViewSet): - def listing_view(self, request): - queryset = self.get_queryset() - self.check_query_parameters(queryset) - queryset = self.filter_queryset(queryset) - queryset = self.paginate_queryset(queryset) - serializer = DefaultPageSerializer(queryset, many=True) - return self.get_paginated_response(serializer.data) - - api_router = WagtailAPIRouter("wagtailapi") api_router.register_endpoint("pages", CustomPagesAPIViewSet) +api_router.register_endpoint("page_preview", PagePreviewAPIViewSet) api_router.register_endpoint("images", CustomImagesAPIViewSet) api_router.register_endpoint("media", MediaAPIViewSet) -api_router.register_endpoint("page_preview", PagePreviewAPIViewSet) diff --git a/etna/articles/blocks.py b/etna/articles/blocks.py index 5f6e28220..4cb7e19d3 100644 --- a/etna/articles/blocks.py +++ b/etna/articles/blocks.py @@ -1,197 +1,30 @@ -from django.conf import settings -from django.utils.html import format_html - from wagtail import blocks -from wagtail.snippets.blocks import SnippetChooserBlock from etna.core.blocks import ( - AuthorPromotedLinkBlock, ContentImageBlock, FeaturedRecordArticleBlock, - NoCaptionImageBlock, - PageListBlock, ParagraphBlock, + PromotedItemBlock, + PromotedListBlock, QuoteBlock, SectionDepthAwareStructBlock, + SubHeadingBlock, ) -from etna.core.blocks.image import APIImageChooserBlock -from etna.core.blocks.paragraph import APIRichTextBlock from ..media.blocks import MediaBlock from ..records.blocks import RecordLinksBlock -class AuthorPromotedPagesBlock(blocks.StructBlock): - heading = blocks.CharBlock(max_length=100) - promoted_items = blocks.ListBlock(AuthorPromotedLinkBlock, max_num=3) - - class Meta: - template = "articles/blocks/promoted_pages.html" - help_text = "Block used promote external pages" - icon = "th-large" - - -class PromotedItemBlock(SectionDepthAwareStructBlock): - title = blocks.CharBlock( - max_length=100, - help_text="Title of the promoted page", - label="Title", - ) - category = blocks.ChoiceBlock( - label="Category", - choices=[ - ("blog", "Blog post"), - ("podcast", "Podcast"), - ("video", "Video"), - ("video-external", "External video"), - ("external-link", "External link"), - ], - ) - publication_date = blocks.CharBlock( - required=False, - help_text="This is a free text field. Please enter date as per agreed format: 14 April 2021", - ) - author = blocks.CharBlock(required=False) - duration = blocks.CharBlock( - required=False, - max_length=50, - label="Duration", - help_text="Podcast or video duration.", - ) - url = blocks.URLBlock(label="External URL", help_text="URL for the external page") - target_blank = blocks.BooleanBlock( - label=format_html( - "%s%s
" - % ("Should this URL open in a new tab?", "Tick the box if 'yes'") - ), - required=False, - ) - cta_label = blocks.CharBlock( - label="Call to action label", - max_length=50, - help_text=format_html( - "%s %s'." - % ( - "The text displayed on the button for your URL. If your URL links to an external site, " - + "please add the name of the site users will land on, and what they will find on this page. " - + "For example 'Watch our short film ", - "about Shakespeare on YouTube", - ) - ), - ) - image = NoCaptionImageBlock( - label="Teaser image", - template="articles/blocks/images/blog-embed__image-container.html", - ) - description = APIRichTextBlock( - features=settings.INLINE_RICH_TEXT_FEATURES, - help_text="A description of the promoted page", - ) - - class Meta: - label = "Featured link" - template = "articles/blocks/featured_link.html" - help_text = "Block used promote an external page" - icon = "star" - form_template = "form_templates/default-form-with-safe-label.html" - - -class PromotedListItemBlock(SectionDepthAwareStructBlock): - """ - Items for promoted list block. - """ - - title = blocks.CharBlock( - required=True, - max_length=100, - help_text="The title of the target page", - ) - description = APIRichTextBlock( - required=False, - features=settings.INLINE_RICH_TEXT_FEATURES, - help_text="A description of the target page", - ) - url = blocks.URLBlock(required=True) - - class Meta: - icon = "star" - - -class PromotedListBlock(blocks.StructBlock): - """ - Streamfield for collating a series of links for research or interesting pages. - """ - - category = SnippetChooserBlock("categories.Category") - summary = APIRichTextBlock( - required=False, features=settings.INLINE_RICH_TEXT_FEATURES - ) - promoted_items = blocks.ListBlock(PromotedListItemBlock()) - - class Meta: - icon = "external-link-alt" - label = "Link list" - template = "articles/blocks/promoted_list_block.html" - - -class RelatedItemBlock(SectionDepthAwareStructBlock): - title = blocks.CharBlock( - max_length=100, - help_text="Title of the promoted page", - ) - description = blocks.TextBlock( - help_text="A description of the promoted page", - ) - teaser_image = APIImageChooserBlock( - help_text="Image that will appear on thumbnails and promos around the site." - ) - url = blocks.URLBlock(label="external URL", help_text="URL for the external page") - - class Meta: - icon = "external-link-alt" - help_text = "Block used promote an external page" - template = "articles/blocks/related_item.html" - - -class FeaturedCollectionBlock(SectionDepthAwareStructBlock): - heading = blocks.CharBlock(max_length=100) - description = blocks.TextBlock(max_length=200) - items = PageListBlock( - "articles.ArticlePage", - "articles.RecordArticlePage", - "articles.FocusedArticlePage", - exclude_drafts=True, - exclude_private=True, - select_related=["teaser_image"], - min_num=3, - max_num=9, - ) - - class Meta: - icon = "list" - label = "Featured pages" - template = "articles/blocks/featured_collection.html" - - -class SubHeadingBlock(SectionDepthAwareStructBlock): - heading = blocks.CharBlock(max_length=100, label="Sub-heading") - - class Meta: - icon = "heading" - label = "Sub-heading" - template = "articles/blocks/sub_heading.html" - - class SectionContentBlock(blocks.StreamBlock): - paragraph = ParagraphBlock() - quote = QuoteBlock() - sub_heading = SubHeadingBlock() + featured_record_article = FeaturedRecordArticleBlock() image = ContentImageBlock() media = MediaBlock() - featured_record_article = FeaturedRecordArticleBlock() + paragraph = ParagraphBlock() promoted_item = PromotedItemBlock() promoted_list = PromotedListBlock() + quote = QuoteBlock() record_links = RecordLinksBlock() + sub_heading = SubHeadingBlock() class ContentSectionBlock(SectionDepthAwareStructBlock): diff --git a/etna/articles/migrations/0012_add_related_items.py b/etna/articles/migrations/0012_add_related_items.py index 97401903e..448291946 100644 --- a/etna/articles/migrations/0012_add_related_items.py +++ b/etna/articles/migrations/0012_add_related_items.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-07-29 11:36 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -246,7 +247,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0014_alter_field_body.py b/etna/articles/migrations/0014_alter_field_body.py index 373047288..69af58cda 100644 --- a/etna/articles/migrations/0014_alter_field_body.py +++ b/etna/articles/migrations/0014_alter_field_body.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-08-10 13:38 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -261,7 +262,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0016_remove_author_block.py b/etna/articles/migrations/0016_remove_author_block.py index aff7ad4db..f3c69b022 100644 --- a/etna/articles/migrations/0016_remove_author_block.py +++ b/etna/articles/migrations/0016_remove_author_block.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-08-10 15:25 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -248,7 +249,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0017_alter_richtext_features.py b/etna/articles/migrations/0017_alter_richtext_features.py index 9d9bbe024..33cb9b3d0 100644 --- a/etna/articles/migrations/0017_alter_richtext_features.py +++ b/etna/articles/migrations/0017_alter_richtext_features.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-08-12 11:18 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -278,7 +279,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0018_replace_pubdate_with_duration.py b/etna/articles/migrations/0018_replace_pubdate_with_duration.py index 6d44a654b..25632ad80 100644 --- a/etna/articles/migrations/0018_replace_pubdate_with_duration.py +++ b/etna/articles/migrations/0018_replace_pubdate_with_duration.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-08-12 14:27 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -256,7 +257,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0019_restore_0017_overwritten_by_0018.py b/etna/articles/migrations/0019_restore_0017_overwritten_by_0018.py index fb4537182..6a9a1c93b 100644 --- a/etna/articles/migrations/0019_restore_0017_overwritten_by_0018.py +++ b/etna/articles/migrations/0019_restore_0017_overwritten_by_0018.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-08-13 10:55 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -256,7 +257,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0020_alter_field_body.py b/etna/articles/migrations/0020_alter_field_body.py index 3bbbc5690..aaace2f06 100644 --- a/etna/articles/migrations/0020_alter_field_body.py +++ b/etna/articles/migrations/0020_alter_field_body.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-08-13 16:54 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -265,7 +266,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0021_reinstate_pub_date_as_optional_field.py b/etna/articles/migrations/0021_reinstate_pub_date_as_optional_field.py index d74d04bc7..a2425edcd 100644 --- a/etna/articles/migrations/0021_reinstate_pub_date_as_optional_field.py +++ b/etna/articles/migrations/0021_reinstate_pub_date_as_optional_field.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-08-16 10:37 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -269,7 +270,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0022_make_quote_heading_optional.py b/etna/articles/migrations/0022_make_quote_heading_optional.py index 5ed482eed..f8bdf214d 100644 --- a/etna/articles/migrations/0022_make_quote_heading_optional.py +++ b/etna/articles/migrations/0022_make_quote_heading_optional.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-09-06 09:49 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -269,7 +270,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0023_make_paragraph_heading_editable.py b/etna/articles/migrations/0023_make_paragraph_heading_editable.py index 4d2102611..3749bc5ea 100644 --- a/etna/articles/migrations/0023_make_paragraph_heading_editable.py +++ b/etna/articles/migrations/0023_make_paragraph_heading_editable.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-10-13 16:11 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -321,7 +322,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0024_fix_heading_help_text.py b/etna/articles/migrations/0024_fix_heading_help_text.py index 2f72c9379..8f138e808 100644 --- a/etna/articles/migrations/0024_fix_heading_help_text.py +++ b/etna/articles/migrations/0024_fix_heading_help_text.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-11-03 15:49 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -329,7 +330,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0025_auto_20211111_1709.py b/etna/articles/migrations/0025_auto_20211111_1709.py index 3db03fd9e..d3dc8862c 100644 --- a/etna/articles/migrations/0025_auto_20211111_1709.py +++ b/etna/articles/migrations/0025_auto_20211111_1709.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-11-11 17:09 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -294,7 +295,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0026_add_accessible_image_block.py b/etna/articles/migrations/0026_add_accessible_image_block.py index 1cc0b096c..880730035 100644 --- a/etna/articles/migrations/0026_add_accessible_image_block.py +++ b/etna/articles/migrations/0026_add_accessible_image_block.py @@ -1,4 +1,5 @@ # Generated by Django 3.1.8 on 2021-11-16 10:03 +# etna:allowAlterField from django.db import migrations, models import etna.articles.blocks @@ -387,7 +388,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0027_change_accessible_image_required.py b/etna/articles/migrations/0027_change_accessible_image_required.py index a9ecaded8..8e5c0c31e 100644 --- a/etna/articles/migrations/0027_change_accessible_image_required.py +++ b/etna/articles/migrations/0027_change_accessible_image_required.py @@ -1,4 +1,5 @@ # Generated by Django 3.2.9 on 2021-11-18 14:10 +# etna:allowAlterField from django.db import migrations, models import etna.articles.blocks @@ -362,7 +363,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0035_add_content_section_blocks_to_insights_body.py b/etna/articles/migrations/0035_add_content_section_blocks_to_insights_body.py index 2efe8aaf8..f2ec1813e 100644 --- a/etna/articles/migrations/0035_add_content_section_blocks_to_insights_body.py +++ b/etna/articles/migrations/0035_add_content_section_blocks_to_insights_body.py @@ -1,7 +1,9 @@ # Generated by Django 3.2.12 on 2022-04-05 17:14 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks +import etna.core.blocks import etna.media.blocks import etna.records.blocks import wagtail.blocks @@ -522,7 +524,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] @@ -876,7 +878,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] @@ -1224,7 +1226,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0037_remove_top_level_content_options_from_insights_body.py b/etna/articles/migrations/0037_remove_top_level_content_options_from_insights_body.py index 7ba682bba..40f75decd 100644 --- a/etna/articles/migrations/0037_remove_top_level_content_options_from_insights_body.py +++ b/etna/articles/migrations/0037_remove_top_level_content_options_from_insights_body.py @@ -1,4 +1,5 @@ # Generated by Django 3.2.12 on 2022-04-06 17:22 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -522,7 +523,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] @@ -876,7 +877,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0038_structured_streamblock_amends.py b/etna/articles/migrations/0038_structured_streamblock_amends.py index 1be897ed3..df2f69b47 100644 --- a/etna/articles/migrations/0038_structured_streamblock_amends.py +++ b/etna/articles/migrations/0038_structured_streamblock_amends.py @@ -1,4 +1,5 @@ # Generated by Django 3.2.12 on 2022-04-14 09:47 +# etna:allowAlterField from django.db import migrations import etna.articles.blocks @@ -440,7 +441,7 @@ class Migration(migrations.Migration): ( "related_items", wagtail.blocks.ListBlock( - etna.articles.blocks.RelatedItemBlock + etna.core.blocks.RelatedItemBlock ), ), ] diff --git a/etna/articles/migrations/0107_alter_articlepage_body_alter_focusedarticlepage_body.py b/etna/articles/migrations/0107_alter_articlepage_body_alter_focusedarticlepage_body.py new file mode 100644 index 000000000..d054e126b --- /dev/null +++ b/etna/articles/migrations/0107_alter_articlepage_body_alter_focusedarticlepage_body.py @@ -0,0 +1,760 @@ +# Generated by Django 5.0.6 on 2024-06-13 13:40 +# etna:allowAlterField + +import etna.core.blocks.image +import etna.core.blocks.page_chooser +import etna.core.blocks.paragraph +import etna.media.blocks +import etna.records.blocks +import wagtail.blocks +import wagtail.fields +import wagtail.snippets.blocks +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("articles", "0106_alter_articlepage_body_alter_focusedarticlepage_body"), + ] + + operations = [ + migrations.AlterField( + model_name="articlepage", + name="body", + field=wagtail.fields.StreamField( + [ + ( + "content_section", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + label="Heading", max_length=100 + ), + ), + ( + "content", + wagtail.blocks.StreamBlock( + [ + ( + "featured_record_article", + wagtail.blocks.StructBlock( + [ + ( + "page", + etna.core.blocks.page_chooser.APIPageChooserBlock( + label="Page", + page_type=[ + "articles.RecordArticlePage" + ], + required_api_fields=[ + "teaser_image" + ], + ), + ) + ] + ), + ), + ( + "image", + wagtail.blocks.StructBlock( + [ + ( + "image", + etna.core.blocks.image.APIImageChooserBlock( + rendition_size="max-900x900", + required=True, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + help_text='Alternative (alt) text describes images when they fail to load, and is read aloud by assistive technologies. Use a maximum of 100 characters to describe your image. Check the guidance for tips on writing alt text.', + label="Alternative text", + max_length=100, + ), + ), + ( + "caption", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="If provided, displays directly below the image. Can be used to specify sources, transcripts or other useful metadata.", + label="Caption (optional)", + required=False, + ), + ), + ] + ), + ), + ( + "media", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="A descriptive title for the media block", + required=True, + ), + ), + ( + "background_image", + etna.core.blocks.image.APIImageChooserBlock( + help_text="A background image for the media block" + ), + ), + ( + "media", + etna.media.blocks.MediaChooserBlock(), + ), + ] + ), + ), + ( + "paragraph", + wagtail.blocks.StructBlock( + [ + ( + "text", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + "ol", + "ul", + ] + ), + ) + ] + ), + ), + ( + "promoted_item", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="Title of the promoted page", + label="Title", + max_length=100, + ), + ), + ( + "category", + wagtail.blocks.ChoiceBlock( + choices=[ + ( + "blog", + "Blog post", + ), + ( + "podcast", + "Podcast", + ), + ("video", "Video"), + ( + "video-external", + "External video", + ), + ( + "external-link", + "External link", + ), + ], + label="Category", + ), + ), + ( + "publication_date", + wagtail.blocks.CharBlock( + help_text="This is a free text field. Please enter date as per agreed format: 14 April 2021", + required=False, + ), + ), + ( + "author", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "duration", + wagtail.blocks.CharBlock( + help_text="Podcast or video duration.", + label="Duration", + max_length=50, + required=False, + ), + ), + ( + "url", + wagtail.blocks.URLBlock( + help_text="URL for the external page", + label="External URL", + ), + ), + ( + "target_blank", + wagtail.blocks.BooleanBlock( + label="Should this URL open in a new tab?Tick the box if 'yes'
", + required=False, + ), + ), + ( + "cta_label", + wagtail.blocks.CharBlock( + help_text="The text displayed on the button for your URL. If your URL links to an external site, please add the name of the site users will land on, and what they will find on this page. For example 'Watch our short film about Shakespeare on YouTube'.", + label="Call to action label", + max_length=50, + ), + ), + ( + "image", + wagtail.blocks.StructBlock( + [ + ( + "image", + etna.core.blocks.image.APIImageChooserBlock( + rendition_size="max-900x900", + required=True, + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + help_text='Decorative images are used for visual effect and do not add information to the content of a page. "Check the guidance to see if your image is decorative.', + label="Is this image decorative?Tick the box if 'yes'
", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + help_text='Alternative (alt) text describes images when they fail to load, and is read aloud by assistive technologies. Use a maximum of 100 characters to describe your image. Decorative images do not require alt text. Check the guidance for tips on writing alt text.', + label="Image alternative text", + max_length=100, + required=False, + ), + ), + ], + label="Teaser image", + template="articles/blocks/images/blog-embed__image-container.html", + ), + ), + ( + "description", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="A description of the promoted page", + ), + ), + ] + ), + ), + ( + "promoted_list", + wagtail.blocks.StructBlock( + [ + ( + "category", + wagtail.snippets.blocks.SnippetChooserBlock( + "categories.Category" + ), + ), + ( + "summary", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + required=False, + ), + ), + ( + "promoted_items", + wagtail.blocks.ListBlock( + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="The title of the target page", + max_length=100, + required=True, + ), + ), + ( + "description", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="A description of the target page", + required=False, + ), + ), + ( + "url", + wagtail.blocks.URLBlock( + required=True + ), + ), + ] + ) + ), + ), + ] + ), + ), + ( + "quote", + wagtail.blocks.StructBlock( + [ + ( + "quote", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + required=True, + ), + ), + ( + "attribution", + wagtail.blocks.CharBlock( + max_length=100, + required=False, + ), + ), + ] + ), + ), + ( + "record_links", + wagtail.blocks.StructBlock( + [ + ( + "items", + wagtail.blocks.ListBlock( + etna.records.blocks.RecordLinkBlock, + label="Items", + ), + ) + ] + ), + ), + ( + "sub_heading", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + label="Sub-heading", + max_length=100, + ), + ) + ] + ), + ), + ], + required=False, + ), + ), + ] + ), + ) + ], + blank=True, + null=True, + ), + ), + migrations.AlterField( + model_name="focusedarticlepage", + name="body", + field=wagtail.fields.StreamField( + [ + ( + "content_section", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + label="Heading", max_length=100 + ), + ), + ( + "content", + wagtail.blocks.StreamBlock( + [ + ( + "featured_record_article", + wagtail.blocks.StructBlock( + [ + ( + "page", + etna.core.blocks.page_chooser.APIPageChooserBlock( + label="Page", + page_type=[ + "articles.RecordArticlePage" + ], + required_api_fields=[ + "teaser_image" + ], + ), + ) + ] + ), + ), + ( + "image", + wagtail.blocks.StructBlock( + [ + ( + "image", + etna.core.blocks.image.APIImageChooserBlock( + rendition_size="max-900x900", + required=True, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + help_text='Alternative (alt) text describes images when they fail to load, and is read aloud by assistive technologies. Use a maximum of 100 characters to describe your image. Check the guidance for tips on writing alt text.', + label="Alternative text", + max_length=100, + ), + ), + ( + "caption", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="If provided, displays directly below the image. Can be used to specify sources, transcripts or other useful metadata.", + label="Caption (optional)", + required=False, + ), + ), + ] + ), + ), + ( + "media", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="A descriptive title for the media block", + required=True, + ), + ), + ( + "background_image", + etna.core.blocks.image.APIImageChooserBlock( + help_text="A background image for the media block" + ), + ), + ( + "media", + etna.media.blocks.MediaChooserBlock(), + ), + ] + ), + ), + ( + "paragraph", + wagtail.blocks.StructBlock( + [ + ( + "text", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + "ol", + "ul", + ] + ), + ) + ] + ), + ), + ( + "promoted_item", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="Title of the promoted page", + label="Title", + max_length=100, + ), + ), + ( + "category", + wagtail.blocks.ChoiceBlock( + choices=[ + ( + "blog", + "Blog post", + ), + ( + "podcast", + "Podcast", + ), + ("video", "Video"), + ( + "video-external", + "External video", + ), + ( + "external-link", + "External link", + ), + ], + label="Category", + ), + ), + ( + "publication_date", + wagtail.blocks.CharBlock( + help_text="This is a free text field. Please enter date as per agreed format: 14 April 2021", + required=False, + ), + ), + ( + "author", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "duration", + wagtail.blocks.CharBlock( + help_text="Podcast or video duration.", + label="Duration", + max_length=50, + required=False, + ), + ), + ( + "url", + wagtail.blocks.URLBlock( + help_text="URL for the external page", + label="External URL", + ), + ), + ( + "target_blank", + wagtail.blocks.BooleanBlock( + label="Should this URL open in a new tab?Tick the box if 'yes'
", + required=False, + ), + ), + ( + "cta_label", + wagtail.blocks.CharBlock( + help_text="The text displayed on the button for your URL. If your URL links to an external site, please add the name of the site users will land on, and what they will find on this page. For example 'Watch our short film about Shakespeare on YouTube'.", + label="Call to action label", + max_length=50, + ), + ), + ( + "image", + wagtail.blocks.StructBlock( + [ + ( + "image", + etna.core.blocks.image.APIImageChooserBlock( + rendition_size="max-900x900", + required=True, + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + help_text='Decorative images are used for visual effect and do not add information to the content of a page. "Check the guidance to see if your image is decorative.', + label="Is this image decorative?Tick the box if 'yes'
", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + help_text='Alternative (alt) text describes images when they fail to load, and is read aloud by assistive technologies. Use a maximum of 100 characters to describe your image. Decorative images do not require alt text. Check the guidance for tips on writing alt text.', + label="Image alternative text", + max_length=100, + required=False, + ), + ), + ], + label="Teaser image", + template="articles/blocks/images/blog-embed__image-container.html", + ), + ), + ( + "description", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="A description of the promoted page", + ), + ), + ] + ), + ), + ( + "promoted_list", + wagtail.blocks.StructBlock( + [ + ( + "category", + wagtail.snippets.blocks.SnippetChooserBlock( + "categories.Category" + ), + ), + ( + "summary", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + required=False, + ), + ), + ( + "promoted_items", + wagtail.blocks.ListBlock( + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="The title of the target page", + max_length=100, + required=True, + ), + ), + ( + "description", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="A description of the target page", + required=False, + ), + ), + ( + "url", + wagtail.blocks.URLBlock( + required=True + ), + ), + ] + ) + ), + ), + ] + ), + ), + ( + "quote", + wagtail.blocks.StructBlock( + [ + ( + "quote", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + required=True, + ), + ), + ( + "attribution", + wagtail.blocks.CharBlock( + max_length=100, + required=False, + ), + ), + ] + ), + ), + ( + "record_links", + wagtail.blocks.StructBlock( + [ + ( + "items", + wagtail.blocks.ListBlock( + etna.records.blocks.RecordLinkBlock, + label="Items", + ), + ) + ] + ), + ), + ( + "sub_heading", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + label="Sub-heading", + max_length=100, + ), + ) + ] + ), + ), + ], + required=False, + ), + ), + ] + ), + ) + ], + blank=True, + null=True, + ), + ), + ] diff --git a/etna/articles/models.py b/etna/articles/models.py index 90dacf269..ab1d960b6 100755 --- a/etna/articles/models.py +++ b/etna/articles/models.py @@ -28,6 +28,7 @@ from etna.authors.models import AuthorPageMixin from etna.collections.models import TopicalPageMixin +from etna.core.blocks import AuthorPromotedPagesBlock, FeaturedCollectionBlock from etna.core.models import ( BasePageWithIntro, ContentWarningMixin, @@ -45,11 +46,7 @@ from etna.core.utils import skos_id_from_text from etna.records.fields import RecordField -from .blocks import ( - ArticlePageStreamBlock, - AuthorPromotedPagesBlock, - FeaturedCollectionBlock, -) +from .blocks import ArticlePageStreamBlock @register_snippet @@ -776,7 +773,7 @@ class Meta: APIField("promoted_links"), APIField( "intro_image", - serializer=ImageSerializer(rendition_size="fill-512x512"), + serializer=ImageSerializer(rendition_size="width-400"), ), ] + TopicalPageMixin.api_fields diff --git a/etna/authors/models.py b/etna/authors/models.py index a0600beb1..89982b05f 100644 --- a/etna/authors/models.py +++ b/etna/authors/models.py @@ -71,6 +71,7 @@ class AuthorPage(BasePage): class Meta: verbose_name = "Author page" verbose_name_plural = "Author pages" + verbose_name_public = "author" # DataLayerMixin overrides gtm_content_group = "Author page" diff --git a/etna/collections/models.py b/etna/collections/models.py index cd1131208..d5305d0f9 100644 --- a/etna/collections/models.py +++ b/etna/collections/models.py @@ -246,7 +246,7 @@ class TopicExplorerPage(RequiredHeroImageMixin, AlertMixin, BasePageWithIntro): class Meta: verbose_name = _("topic page") verbose_name_plural = _("topic pages") - verbose_name_public = _("explore by topic") + verbose_name_public = _("topic") featured_article = models.ForeignKey( "wagtailcore.Page", @@ -486,7 +486,7 @@ class TimePeriodExplorerPage(RequiredHeroImageMixin, AlertMixin, BasePageWithInt class Meta: verbose_name = _("time period page") verbose_name_plural = _("time period pages") - verbose_name_public = _("explore by time period") + verbose_name_public = _("time period") featured_article = models.ForeignKey( "wagtailcore.Page", @@ -772,9 +772,7 @@ def highlight_image_count(self): class HighlightSerializer(serializers.ModelSerializer): - image = HighlightImageSerializer( - rendition_size="max-1024x1024", additional_formats=["png"] - ) + image = HighlightImageSerializer(rendition_size="max-1024x1024") class Meta: model = Highlight @@ -794,7 +792,7 @@ class HighlightCardSerializer(serializers.Serializer): rendition_size = "fill-600x400" jpeg_quality = 60 - webp_quality = 80 + webp_quality = 60 additional_formats = [] def to_representation(self, value): diff --git a/etna/core/blocks/__init__.py b/etna/core/blocks/__init__.py index 75584f143..3670b34c8 100644 --- a/etna/core/blocks/__init__.py +++ b/etna/core/blocks/__init__.py @@ -1,27 +1,44 @@ from .base import SectionDepthAwareStructBlock -from .cta import LargeCardLinksBlock -from .featured_content import FeaturedRecordArticleBlock +from .cta import ButtonBlock, CallToActionBlock, LargeCardLinksBlock +from .featured_content import ( + FeaturedCollectionBlock, + FeaturedRecordArticleBlock, + RelatedItemBlock, +) from .image import ContentImageBlock, ImageBlock, NoCaptionImageBlock from .page_chooser import APIPageChooserBlock from .page_list import PageListBlock from .paragraph import ParagraphBlock, ParagraphWithHeading -from .promoted_links import AuthorPromotedLinkBlock, PromotedLinkBlock +from .promoted_links import ( + AuthorPromotedLinkBlock, + AuthorPromotedPagesBlock, + PromotedItemBlock, + PromotedLinkBlock, + PromotedListBlock, +) from .quote import QuoteBlock -from .section import SectionBlock +from .section import SectionBlock, SubHeadingBlock __all__ = [ "APIPageChooserBlock", + "AuthorPromotedPagesBlock", + "ButtonBlock", + "CallToActionBlock", "ContentImageBlock", "FeaturedRecordArticleBlock", + "FeaturedCollectionBlock", "ImageBlock", "NoCaptionImageBlock", "PageListBlock", "ParagraphBlock", "ParagraphWithHeading", "PromotedLinkBlock", + "PromotedListBlock", + "PromotedItemBlock", "AuthorPromotedLinkBlock", "LargeCardLinksBlock", "QuoteBlock", + "RelatedItemBlock", "SectionBlock", "SectionDepthAwareStructBlock", "SubHeadingBlock", diff --git a/etna/core/blocks/cta.py b/etna/core/blocks/cta.py index c6461043b..575b6bfa1 100644 --- a/etna/core/blocks/cta.py +++ b/etna/core/blocks/cta.py @@ -1,8 +1,11 @@ +from django.conf import settings +from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from wagtail import blocks from .page_chooser import APIPageChooserBlock +from .paragraph import APIRichTextBlock class LargeCardLinksBlock(blocks.StructBlock): @@ -29,3 +32,52 @@ def get_context(self, value, parent_context=None): link_pages.append(page_2.specific) context["link_pages"] = link_pages return context + + +class ButtonBlock(blocks.StructBlock): + label = blocks.CharBlock() + link = APIPageChooserBlock(required=False) + external_link = blocks.URLBlock(required=False) + accented = blocks.BooleanBlock( + required=False, + help_text="Use the accented button style", + label="Accented", + ) + + def clean(self, value): + data = super().clean(value) + + if data.get("link") and data.get("external_link"): + raise ValidationError( + "You must provide either a page link or an external link, not both." + ) + elif not (data.get("link") or data.get("external_link")): + raise ValidationError( + "You must provide either a page link or an external link." + ) + + return data + + def get_api_representation(self, value, context=None): + representation = { + "label": value["label"], + "href": value.get("external_link") or value["link"].full_url, + "accent": value.get("accented") or False, + } + + return representation + + class Meta: + icon = "link" + label = "Button" + + +class CallToActionBlock(blocks.StructBlock): + body = APIRichTextBlock( + max_length=100, features=settings.RESTRICTED_RICH_TEXT_FEATURES + ) + button = ButtonBlock() + + class Meta: + icon = "link" + label = "Call to action" diff --git a/etna/core/blocks/featured_content.py b/etna/core/blocks/featured_content.py index 3a9adbf42..99967ce85 100644 --- a/etna/core/blocks/featured_content.py +++ b/etna/core/blocks/featured_content.py @@ -1,6 +1,10 @@ from wagtail import blocks +from etna.core.blocks.image import APIImageChooserBlock + +from .base import SectionDepthAwareStructBlock from .page_chooser import APIPageChooserBlock +from .page_list import PageListBlock class FeaturedRecordArticleBlock(blocks.StructBlock): @@ -16,3 +20,42 @@ class Meta: icon = "doc-empty-inverse" template = "blocks/featured_record_article.html" label = "Featured record article" + + +class RelatedItemBlock(SectionDepthAwareStructBlock): + title = blocks.CharBlock( + max_length=100, + help_text="Title of the promoted page", + ) + description = blocks.TextBlock( + help_text="A description of the promoted page", + ) + teaser_image = APIImageChooserBlock( + help_text="Image that will appear on thumbnails and promos around the site." + ) + url = blocks.URLBlock(label="external URL", help_text="URL for the external page") + + class Meta: + icon = "link" + help_text = "Block used promote an external page" + template = "articles/blocks/related_item.html" + + +class FeaturedCollectionBlock(SectionDepthAwareStructBlock): + heading = blocks.CharBlock(max_length=100) + description = blocks.TextBlock(max_length=200) + items = PageListBlock( + "articles.ArticlePage", + "articles.RecordArticlePage", + "articles.FocusedArticlePage", + exclude_drafts=True, + exclude_private=True, + select_related=["teaser_image"], + min_num=3, + max_num=9, + ) + + class Meta: + icon = "list" + label = "Featured pages" + template = "articles/blocks/featured_collection.html" diff --git a/etna/core/blocks/image.py b/etna/core/blocks/image.py index 09f79be63..ef94def40 100644 --- a/etna/core/blocks/image.py +++ b/etna/core/blocks/image.py @@ -32,7 +32,7 @@ def __init__( help_text=None, rendition_size="fill-600x400", jpeg_quality=60, - webp_quality=80, + webp_quality=60, **kwargs, ): self.jpeg_quality = jpeg_quality diff --git a/etna/core/blocks/promoted_links.py b/etna/core/blocks/promoted_links.py index e6e3c700e..207d587b9 100644 --- a/etna/core/blocks/promoted_links.py +++ b/etna/core/blocks/promoted_links.py @@ -1,6 +1,14 @@ +from django.conf import settings +from django.utils.html import format_html + from wagtail import blocks +from wagtail.snippets.blocks import SnippetChooserBlock from etna.core.blocks.image import APIImageChooserBlock +from etna.core.blocks.paragraph import APIRichTextBlock + +from .base import SectionDepthAwareStructBlock +from .image import NoCaptionImageBlock class PromotedLinkBlock(blocks.StructBlock): @@ -20,3 +28,116 @@ class AuthorPromotedLinkBlock(PromotedLinkBlock): help_text="This is a free text field. Please enter date as per agreed format: 14 April 2021", ) author = blocks.CharBlock(required=False) + + +class AuthorPromotedPagesBlock(blocks.StructBlock): + heading = blocks.CharBlock(max_length=100) + promoted_items = blocks.ListBlock(AuthorPromotedLinkBlock, max_num=3) + + class Meta: + template = "articles/blocks/promoted_pages.html" + help_text = "Block used to promote external pages" + icon = "th-large" + + +class PromotedItemBlock(SectionDepthAwareStructBlock): + title = blocks.CharBlock( + max_length=100, + help_text="Title of the promoted page", + label="Title", + ) + category = blocks.ChoiceBlock( + label="Category", + choices=[ + ("blog", "Blog post"), + ("podcast", "Podcast"), + ("video", "Video"), + ("video-external", "External video"), + ("external-link", "External link"), + ], + ) + publication_date = blocks.CharBlock( + required=False, + help_text="This is a free text field. Please enter date as per agreed format: 14 April 2021", + ) + author = blocks.CharBlock(required=False) + duration = blocks.CharBlock( + required=False, + max_length=50, + label="Duration", + help_text="Podcast or video duration.", + ) + url = blocks.URLBlock(label="External URL", help_text="URL for the external page") + target_blank = blocks.BooleanBlock( + label=format_html( + "%s%s
" + % ("Should this URL open in a new tab?", "Tick the box if 'yes'") + ), + required=False, + ) + cta_label = blocks.CharBlock( + label="Call to action label", + max_length=50, + help_text=format_html( + "%s %s'." + % ( + "The text displayed on the button for your URL. If your URL links to an external site, " + + "please add the name of the site users will land on, and what they will find on this page. " + + "For example 'Watch our short film ", + "about Shakespeare on YouTube", + ) + ), + ) + image = NoCaptionImageBlock( + label="Teaser image", + template="articles/blocks/images/blog-embed__image-container.html", + ) + description = APIRichTextBlock( + features=settings.INLINE_RICH_TEXT_FEATURES, + help_text="A description of the promoted page", + ) + + class Meta: + label = "Featured link" + template = "articles/blocks/featured_link.html" + help_text = "Block used promote an external page" + icon = "star" + form_template = "form_templates/default-form-with-safe-label.html" + + +class PromotedListItemBlock(SectionDepthAwareStructBlock): + """ + Items for promoted list block. + """ + + title = blocks.CharBlock( + required=True, + max_length=100, + help_text="The title of the target page", + ) + description = APIRichTextBlock( + required=False, + features=settings.INLINE_RICH_TEXT_FEATURES, + help_text="A description of the target page", + ) + url = blocks.URLBlock(required=True) + + class Meta: + icon = "star" + + +class PromotedListBlock(blocks.StructBlock): + """ + Streamfield for collating a series of links for research or interesting pages. + """ + + category = SnippetChooserBlock("categories.Category") + summary = APIRichTextBlock( + required=False, features=settings.INLINE_RICH_TEXT_FEATURES + ) + promoted_items = blocks.ListBlock(PromotedListItemBlock()) + + class Meta: + icon = "link" + label = "Link list" + template = "articles/blocks/promoted_list_block.html" diff --git a/etna/core/blocks/section.py b/etna/core/blocks/section.py index c3305000c..b42b0a9f4 100644 --- a/etna/core/blocks/section.py +++ b/etna/core/blocks/section.py @@ -2,6 +2,8 @@ from wagtail import blocks +from .base import SectionDepthAwareStructBlock + class SectionBlock(blocks.StructBlock): heading = blocks.CharBlock( @@ -20,3 +22,12 @@ def get_context(self, value, parent_context=None): context = super().get_context(value, parent_context) context["heading_id"] = self.get_heading_id(value) return context + + +class SubHeadingBlock(SectionDepthAwareStructBlock): + heading = blocks.CharBlock(max_length=100, label="Sub-heading") + + class Meta: + icon = "heading" + label = "Sub-heading" + template = "articles/blocks/sub_heading.html" diff --git a/etna/core/models/basepage.py b/etna/core/models/basepage.py index 7bf39f616..7a77b3602 100644 --- a/etna/core/models/basepage.py +++ b/etna/core/models/basepage.py @@ -40,7 +40,7 @@ @method_decorator(apply_default_vary_headers, name="serve") @method_decorator(apply_default_cache_control, name="serve") -class BasePage(MetadataPageMixin, DataLayerMixin, Page, HeadlessPreviewMixin): +class BasePage(MetadataPageMixin, DataLayerMixin, HeadlessPreviewMixin, Page): """ An abstract base model that is used for all Page models within the project. Any common fields, Wagtail overrides or custom @@ -145,6 +145,13 @@ def get_datalayer_data(self, request: HttpRequest) -> Dict[str, Any]: data.update(customDimension3=self._meta.verbose_name) return data + @property + def privacy(self): + privacy = [r.restriction_type for r in self.get_view_restrictions()] + if privacy: + return privacy[0] + return "public" + default_api_fields = [ APIField("id"), APIField("title"), @@ -165,10 +172,6 @@ def get_datalayer_data(self, request: HttpRequest) -> Dict[str, Any]: "teaser_image", serializer=ImageSerializer("fill-600x400"), ), - APIField( - "teaser_image_large", - serializer=ImageSerializer("fill-1200x480", source="teaser_image"), - ), APIField( "teaser_image_square", serializer=ImageSerializer("fill-512x512", source="teaser_image"), diff --git a/etna/core/serializers/images.py b/etna/core/serializers/images.py index 215e5bc0c..8eaa6f01b 100644 --- a/etna/core/serializers/images.py +++ b/etna/core/serializers/images.py @@ -28,7 +28,7 @@ def __init__( self, rendition_size="fill-600x400", jpeg_quality=60, - webp_quality=80, + webp_quality=60, additional_formats=[], *args, **kwargs, diff --git a/etna/core/serializers/pages.py b/etna/core/serializers/pages.py index c94cd4c93..44db26646 100644 --- a/etna/core/serializers/pages.py +++ b/etna/core/serializers/pages.py @@ -62,7 +62,7 @@ def get_api_data(object, required_api_fields: list = []) -> dict: api_representation[field.name] = get_field_data( object=specific, field=field ) - return api_representation + return api_representation or None class DefaultPageSerializer(serializers.Serializer): diff --git a/etna/generic_pages/blocks.py b/etna/generic_pages/blocks.py index e4ee27794..e964d24d8 100644 --- a/etna/generic_pages/blocks.py +++ b/etna/generic_pages/blocks.py @@ -1,7 +1,48 @@ from wagtail import blocks -from etna.core.blocks import ParagraphBlock +from etna.core.blocks import ( + ButtonBlock, + CallToActionBlock, + ContentImageBlock, + FeaturedRecordArticleBlock, + ParagraphBlock, + PromotedItemBlock, + PromotedListBlock, + QuoteBlock, + SectionDepthAwareStructBlock, + SubHeadingBlock, +) +from ..media.blocks import MediaBlock +from ..records.blocks import RecordLinksBlock -class GeneralPageStreamBlock(blocks.StreamBlock): + +class SectionContentBlock(blocks.StreamBlock): + button = ButtonBlock() + call_to_action = CallToActionBlock() + featured_record_article = FeaturedRecordArticleBlock() + image = ContentImageBlock() + media = MediaBlock() paragraph = ParagraphBlock() + promoted_item = PromotedItemBlock() + promoted_list = PromotedListBlock() + quote = QuoteBlock() + record_links = RecordLinksBlock() + sub_heading = SubHeadingBlock() + + +class ContentSectionBlock(SectionDepthAwareStructBlock): + heading = blocks.CharBlock(max_length=100, label="Heading") + content = SectionContentBlock(required=False) + + class Meta: + label = "Section" + template = "articles/blocks/section.html" + + +class GeneralPageStreamBlock(blocks.StreamBlock): + """ + A block for the GeneralPage model. + """ + + content_section = ContentSectionBlock() diff --git a/etna/generic_pages/migrations/0010_alter_generalpage_body.py b/etna/generic_pages/migrations/0010_alter_generalpage_body.py new file mode 100644 index 000000000..d66bc078d --- /dev/null +++ b/etna/generic_pages/migrations/0010_alter_generalpage_body.py @@ -0,0 +1,391 @@ +# Generated by Django 5.0.6 on 2024-06-13 13:40 +# etna:allowAlterField + +import etna.core.blocks.image +import etna.core.blocks.page_chooser +import etna.core.blocks.paragraph +import etna.media.blocks +import etna.records.blocks +import wagtail.blocks +import wagtail.fields +import wagtail.snippets.blocks +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("generic_pages", "0009_alter_generalpage_body"), + ] + + operations = [ + migrations.AlterField( + model_name="generalpage", + name="body", + field=wagtail.fields.StreamField( + [ + ( + "content_section", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + label="Heading", max_length=100 + ), + ), + ( + "content", + wagtail.blocks.StreamBlock( + [ + ( + "featured_record_article", + wagtail.blocks.StructBlock( + [ + ( + "page", + etna.core.blocks.page_chooser.APIPageChooserBlock( + label="Page", + page_type=[ + "articles.RecordArticlePage" + ], + required_api_fields=[ + "teaser_image" + ], + ), + ) + ] + ), + ), + ( + "image", + wagtail.blocks.StructBlock( + [ + ( + "image", + etna.core.blocks.image.APIImageChooserBlock( + rendition_size="max-900x900", + required=True, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + help_text='Alternative (alt) text describes images when they fail to load, and is read aloud by assistive technologies. Use a maximum of 100 characters to describe your image. Check the guidance for tips on writing alt text.', + label="Alternative text", + max_length=100, + ), + ), + ( + "caption", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="If provided, displays directly below the image. Can be used to specify sources, transcripts or other useful metadata.", + label="Caption (optional)", + required=False, + ), + ), + ] + ), + ), + ( + "media", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="A descriptive title for the media block", + required=True, + ), + ), + ( + "background_image", + etna.core.blocks.image.APIImageChooserBlock( + help_text="A background image for the media block" + ), + ), + ( + "media", + etna.media.blocks.MediaChooserBlock(), + ), + ] + ), + ), + ( + "paragraph", + wagtail.blocks.StructBlock( + [ + ( + "text", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + "ol", + "ul", + ] + ), + ) + ] + ), + ), + ( + "promoted_item", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="Title of the promoted page", + label="Title", + max_length=100, + ), + ), + ( + "category", + wagtail.blocks.ChoiceBlock( + choices=[ + ( + "blog", + "Blog post", + ), + ( + "podcast", + "Podcast", + ), + ("video", "Video"), + ( + "video-external", + "External video", + ), + ( + "external-link", + "External link", + ), + ], + label="Category", + ), + ), + ( + "publication_date", + wagtail.blocks.CharBlock( + help_text="This is a free text field. Please enter date as per agreed format: 14 April 2021", + required=False, + ), + ), + ( + "author", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "duration", + wagtail.blocks.CharBlock( + help_text="Podcast or video duration.", + label="Duration", + max_length=50, + required=False, + ), + ), + ( + "url", + wagtail.blocks.URLBlock( + help_text="URL for the external page", + label="External URL", + ), + ), + ( + "target_blank", + wagtail.blocks.BooleanBlock( + label="Should this URL open in a new tab?Tick the box if 'yes'
", + required=False, + ), + ), + ( + "cta_label", + wagtail.blocks.CharBlock( + help_text="The text displayed on the button for your URL. If your URL links to an external site, please add the name of the site users will land on, and what they will find on this page. For example 'Watch our short film about Shakespeare on YouTube'.", + label="Call to action label", + max_length=50, + ), + ), + ( + "image", + wagtail.blocks.StructBlock( + [ + ( + "image", + etna.core.blocks.image.APIImageChooserBlock( + rendition_size="max-900x900", + required=True, + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + help_text='Decorative images are used for visual effect and do not add information to the content of a page. "Check the guidance to see if your image is decorative.', + label="Is this image decorative?Tick the box if 'yes'
", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + help_text='Alternative (alt) text describes images when they fail to load, and is read aloud by assistive technologies. Use a maximum of 100 characters to describe your image. Decorative images do not require alt text. Check the guidance for tips on writing alt text.', + label="Image alternative text", + max_length=100, + required=False, + ), + ), + ], + label="Teaser image", + template="articles/blocks/images/blog-embed__image-container.html", + ), + ), + ( + "description", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="A description of the promoted page", + ), + ), + ] + ), + ), + ( + "promoted_list", + wagtail.blocks.StructBlock( + [ + ( + "category", + wagtail.snippets.blocks.SnippetChooserBlock( + "categories.Category" + ), + ), + ( + "summary", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + required=False, + ), + ), + ( + "promoted_items", + wagtail.blocks.ListBlock( + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="The title of the target page", + max_length=100, + required=True, + ), + ), + ( + "description", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="A description of the target page", + required=False, + ), + ), + ( + "url", + wagtail.blocks.URLBlock( + required=True + ), + ), + ] + ) + ), + ), + ] + ), + ), + ( + "quote", + wagtail.blocks.StructBlock( + [ + ( + "quote", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + required=True, + ), + ), + ( + "attribution", + wagtail.blocks.CharBlock( + max_length=100, + required=False, + ), + ), + ] + ), + ), + ( + "record_links", + wagtail.blocks.StructBlock( + [ + ( + "items", + wagtail.blocks.ListBlock( + etna.records.blocks.RecordLinkBlock, + label="Items", + ), + ) + ] + ), + ), + ( + "sub_heading", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + label="Sub-heading", + max_length=100, + ), + ) + ] + ), + ), + ], + required=False, + ), + ), + ] + ), + ) + ], + blank=True, + null=True, + ), + ), + ] diff --git a/etna/generic_pages/migrations/0011_alter_generalpage_body.py b/etna/generic_pages/migrations/0011_alter_generalpage_body.py new file mode 100644 index 000000000..193d94ef1 --- /dev/null +++ b/etna/generic_pages/migrations/0011_alter_generalpage_body.py @@ -0,0 +1,473 @@ +# Generated by Django 5.0.6 on 2024-06-17 11:08 +# etna:allowAlterField + +import etna.core.blocks.image +import etna.core.blocks.page_chooser +import etna.core.blocks.paragraph +import etna.media.blocks +import etna.records.blocks +import wagtail.blocks +import wagtail.fields +import wagtail.snippets.blocks +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("generic_pages", "0010_alter_generalpage_body"), + ] + + operations = [ + migrations.AlterField( + model_name="generalpage", + name="body", + field=wagtail.fields.StreamField( + [ + ( + "content_section", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + label="Heading", max_length=100 + ), + ), + ( + "content", + wagtail.blocks.StreamBlock( + [ + ( + "button", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.CharBlock(), + ), + ( + "link", + etna.core.blocks.page_chooser.APIPageChooserBlock( + required=False + ), + ), + ( + "external_link", + wagtail.blocks.URLBlock( + required=False + ), + ), + ( + "accented", + wagtail.blocks.BooleanBlock( + help_text="Use the accented button style", + label="Accented", + required=False, + ), + ), + ] + ), + ), + ( + "call_to_action", + wagtail.blocks.StructBlock( + [ + ( + "body", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + "ol", + "ul", + ], + max_length=100, + ), + ), + ( + "button", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.CharBlock(), + ), + ( + "link", + etna.core.blocks.page_chooser.APIPageChooserBlock( + required=False + ), + ), + ( + "external_link", + wagtail.blocks.URLBlock( + required=False + ), + ), + ( + "accented", + wagtail.blocks.BooleanBlock( + help_text="Use the accented button style", + label="Accented", + required=False, + ), + ), + ] + ), + ), + ] + ), + ), + ( + "featured_record_article", + wagtail.blocks.StructBlock( + [ + ( + "page", + etna.core.blocks.page_chooser.APIPageChooserBlock( + label="Page", + page_type=[ + "articles.RecordArticlePage" + ], + required_api_fields=[ + "teaser_image" + ], + ), + ) + ] + ), + ), + ( + "image", + wagtail.blocks.StructBlock( + [ + ( + "image", + etna.core.blocks.image.APIImageChooserBlock( + rendition_size="max-900x900", + required=True, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + help_text='Alternative (alt) text describes images when they fail to load, and is read aloud by assistive technologies. Use a maximum of 100 characters to describe your image. Check the guidance for tips on writing alt text.', + label="Alternative text", + max_length=100, + ), + ), + ( + "caption", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="If provided, displays directly below the image. Can be used to specify sources, transcripts or other useful metadata.", + label="Caption (optional)", + required=False, + ), + ), + ] + ), + ), + ( + "media", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="A descriptive title for the media block", + required=True, + ), + ), + ( + "background_image", + etna.core.blocks.image.APIImageChooserBlock( + help_text="A background image for the media block" + ), + ), + ( + "media", + etna.media.blocks.MediaChooserBlock(), + ), + ] + ), + ), + ( + "paragraph", + wagtail.blocks.StructBlock( + [ + ( + "text", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + "ol", + "ul", + ] + ), + ) + ] + ), + ), + ( + "promoted_item", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="Title of the promoted page", + label="Title", + max_length=100, + ), + ), + ( + "category", + wagtail.blocks.ChoiceBlock( + choices=[ + ( + "blog", + "Blog post", + ), + ( + "podcast", + "Podcast", + ), + ("video", "Video"), + ( + "video-external", + "External video", + ), + ( + "external-link", + "External link", + ), + ], + label="Category", + ), + ), + ( + "publication_date", + wagtail.blocks.CharBlock( + help_text="This is a free text field. Please enter date as per agreed format: 14 April 2021", + required=False, + ), + ), + ( + "author", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "duration", + wagtail.blocks.CharBlock( + help_text="Podcast or video duration.", + label="Duration", + max_length=50, + required=False, + ), + ), + ( + "url", + wagtail.blocks.URLBlock( + help_text="URL for the external page", + label="External URL", + ), + ), + ( + "target_blank", + wagtail.blocks.BooleanBlock( + label="Should this URL open in a new tab?Tick the box if 'yes'
", + required=False, + ), + ), + ( + "cta_label", + wagtail.blocks.CharBlock( + help_text="The text displayed on the button for your URL. If your URL links to an external site, please add the name of the site users will land on, and what they will find on this page. For example 'Watch our short film about Shakespeare on YouTube'.", + label="Call to action label", + max_length=50, + ), + ), + ( + "image", + wagtail.blocks.StructBlock( + [ + ( + "image", + etna.core.blocks.image.APIImageChooserBlock( + rendition_size="max-900x900", + required=True, + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + help_text='Decorative images are used for visual effect and do not add information to the content of a page. "Check the guidance to see if your image is decorative.', + label="Is this image decorative?Tick the box if 'yes'
", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + help_text='Alternative (alt) text describes images when they fail to load, and is read aloud by assistive technologies. Use a maximum of 100 characters to describe your image. Decorative images do not require alt text. Check the guidance for tips on writing alt text.', + label="Image alternative text", + max_length=100, + required=False, + ), + ), + ], + label="Teaser image", + template="articles/blocks/images/blog-embed__image-container.html", + ), + ), + ( + "description", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="A description of the promoted page", + ), + ), + ] + ), + ), + ( + "promoted_list", + wagtail.blocks.StructBlock( + [ + ( + "category", + wagtail.snippets.blocks.SnippetChooserBlock( + "categories.Category" + ), + ), + ( + "summary", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + required=False, + ), + ), + ( + "promoted_items", + wagtail.blocks.ListBlock( + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock( + help_text="The title of the target page", + max_length=100, + required=True, + ), + ), + ( + "description", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + help_text="A description of the target page", + required=False, + ), + ), + ( + "url", + wagtail.blocks.URLBlock( + required=True + ), + ), + ] + ) + ), + ), + ] + ), + ), + ( + "quote", + wagtail.blocks.StructBlock( + [ + ( + "quote", + etna.core.blocks.paragraph.APIRichTextBlock( + features=[ + "bold", + "italic", + "link", + ], + required=True, + ), + ), + ( + "attribution", + wagtail.blocks.CharBlock( + max_length=100, + required=False, + ), + ), + ] + ), + ), + ( + "record_links", + wagtail.blocks.StructBlock( + [ + ( + "items", + wagtail.blocks.ListBlock( + etna.records.blocks.RecordLinkBlock, + label="Items", + ), + ) + ] + ), + ), + ( + "sub_heading", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + label="Sub-heading", + max_length=100, + ), + ) + ] + ), + ), + ], + required=False, + ), + ), + ] + ), + ) + ], + blank=True, + null=True, + ), + ), + ] diff --git a/etna/generic_pages/models.py b/etna/generic_pages/models.py index 1bbdc15f5..c1071d4ba 100644 --- a/etna/generic_pages/models.py +++ b/etna/generic_pages/models.py @@ -8,6 +8,9 @@ class GeneralPage(BasePage): body = StreamField(GeneralPageStreamBlock, blank=True, null=True) + content_panels = BasePage.content_panels + [ FieldPanel("body"), ] + + api_fields = BasePage.api_fields + ["body"] diff --git a/etna/records/blocks.py b/etna/records/blocks.py index 1a83620d6..edfd1b984 100644 --- a/etna/records/blocks.py +++ b/etna/records/blocks.py @@ -134,4 +134,4 @@ class RecordLinksBlock(blocks.StructBlock): class Meta: template = "records/blocks/record_links_block.html" - icon = "archive" + icon = "box-archive" diff --git a/etna/whatson/models.py b/etna/whatson/models.py index 979033f6f..dc372bf63 100644 --- a/etna/whatson/models.py +++ b/etna/whatson/models.py @@ -59,6 +59,7 @@ class EventType(models.Model): class Meta: verbose_name = _("event type") verbose_name_plural = _("event types") + verbose_name_public = _("event") def __str__(self): return self.name diff --git a/poetry.lock b/poetry.lock index 707ca03b1..7efa35055 100644 --- a/poetry.lock +++ b/poetry.lock @@ -56,13 +56,13 @@ files = [ [[package]] name = "babel" -version = "2.14.0" +version = "2.15.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, - {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] [package.extras] @@ -135,13 +135,13 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -367,13 +367,13 @@ files = [ [[package]] name = "django" -version = "5.0.4" +version = "5.0.6" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" files = [ - {file = "Django-5.0.4-py3-none-any.whl", hash = "sha256:916423499d75d62da7aa038d19aef23d23498d8df229775eb0a6309ee1013775"}, - {file = "Django-5.0.4.tar.gz", hash = "sha256:4bd01a8c830bb77a8a3b0e7d8b25b887e536ad17a81ba2dce5476135c73312bd"}, + {file = "Django-5.0.6-py3-none-any.whl", hash = "sha256:8363ac062bb4ef7c3f12d078f6fa5d154031d129a15170a1066412af49d30905"}, + {file = "Django-5.0.6.tar.gz", hash = "sha256:ff1b61005004e476e0aeea47c7f79b85864c70124030e95146315396f1e7951f"}, ] [package.dependencies] @@ -636,13 +636,13 @@ doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] [[package]] name = "faker" -version = "25.0.0" +version = "25.8.0" description = "Faker is a Python package that generates fake data for you." optional = false python-versions = ">=3.8" files = [ - {file = "Faker-25.0.0-py3-none-any.whl", hash = "sha256:e23a2b74888885c3d23a9237bacb823041291c03d609a39acb9ebe6c123f3986"}, - {file = "Faker-25.0.0.tar.gz", hash = "sha256:87ef41e24b39a5be66ecd874af86f77eebd26782a2681200e86c5326340a95d3"}, + {file = "Faker-25.8.0-py3-none-any.whl", hash = "sha256:4c40b34a9c569018d4f9d6366d71a4da8a883d5ddf2b23197be5370f29b7e1b6"}, + {file = "Faker-25.8.0.tar.gz", hash = "sha256:bdec5f2fb057d244ebef6e0ed318fea4dcbdf32c3a1a010766fc45f5d68fc68d"}, ] [package.dependencies] @@ -741,13 +741,13 @@ ipython = {version = ">=7.31.1", markers = "python_version >= \"3.11\""} [[package]] name = "ipython" -version = "8.24.0" +version = "8.25.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.24.0-py3-none-any.whl", hash = "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3"}, - {file = "ipython-8.24.0.tar.gz", hash = "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501"}, + {file = "ipython-8.25.0-py3-none-any.whl", hash = "sha256:53eee7ad44df903a06655871cbab66d156a051fd86f3ec6750470ac9604ac1ab"}, + {file = "ipython-8.25.0.tar.gz", hash = "sha256:c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716"}, ] [package.dependencies] @@ -765,7 +765,7 @@ typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -811,13 +811,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -861,165 +861,153 @@ testing = ["coverage (==7.3.4)", "dj-database-url (==2.1.0)"] [[package]] name = "lxml" -version = "5.2.1" +version = "5.2.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" files = [ - {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1"}, - {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1"}, - {file = "lxml-5.2.1-cp310-cp310-win32.whl", hash = "sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5"}, - {file = "lxml-5.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f"}, - {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867"}, - {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534"}, - {file = "lxml-5.2.1-cp311-cp311-win32.whl", hash = "sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be"}, - {file = "lxml-5.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102"}, - {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851"}, - {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4"}, - {file = "lxml-5.2.1-cp312-cp312-win32.whl", hash = "sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134"}, - {file = "lxml-5.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a"}, - {file = "lxml-5.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461"}, - {file = "lxml-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0"}, - {file = "lxml-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289"}, - {file = "lxml-5.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029"}, - {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af"}, - {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0"}, - {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8"}, - {file = "lxml-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd"}, - {file = "lxml-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c"}, - {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637"}, - {file = "lxml-5.2.1-cp38-cp38-win32.whl", hash = "sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da"}, - {file = "lxml-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806"}, - {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd"}, - {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188"}, - {file = "lxml-5.2.1-cp39-cp39-win32.whl", hash = "sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708"}, - {file = "lxml-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704"}, - {file = "lxml-5.2.1.tar.gz", hash = "sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, ] [package.extras] @@ -1197,13 +1185,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.5.20" +version = "9.5.26" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.20-py3-none-any.whl", hash = "sha256:ad0094a7597bcb5d0cc3e8e543a10927c2581f7f647b9bb4861600f583180f9b"}, - {file = "mkdocs_material-9.5.20.tar.gz", hash = "sha256:986eef0250d22f70fb06ce0f4eac64cc92bd797a589ec3892ce31fad976fe3da"}, + {file = "mkdocs_material-9.5.26-py3-none-any.whl", hash = "sha256:5d01fb0aa1c7946a1e3ae8689aa2b11a030621ecb54894e35aabb74c21016312"}, + {file = "mkdocs_material-9.5.26.tar.gz", hash = "sha256:56aeb91d94cffa43b6296fa4fbf0eb7c840136e563eecfd12c2d9e92e50ba326"}, ] [package.dependencies] @@ -1287,13 +1275,13 @@ files = [ [[package]] name = "openpyxl" -version = "3.1.2" +version = "3.1.3" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.6" files = [ - {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, - {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, + {file = "openpyxl-3.1.3-py2.py3-none-any.whl", hash = "sha256:25071b558db709de9e8782c3d3e058af3b23ffb2fc6f40c8f0c45a154eced2c3"}, + {file = "openpyxl-3.1.3.tar.gz", hash = "sha256:8dd482e5350125b2388070bb2477927be2e8ebc27df61178709bc8c8751da2f9"}, ] [package.dependencies] @@ -1301,13 +1289,13 @@ et-xmlfile = "*" [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -1517,13 +1505,13 @@ tests-min = ["defusedxml", "packaging", "pytest"] [[package]] name = "platformdirs" -version = "4.2.1" +version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, - {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] @@ -1544,13 +1532,13 @@ files = [ [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.47" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, ] [package.dependencies] @@ -1686,17 +1674,16 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -1847,13 +1834,13 @@ pyyaml = "*" [[package]] name = "redis" -version = "5.0.4" +version = "5.0.5" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, - {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, + {file = "redis-5.0.5-py3-none-any.whl", hash = "sha256:30b47d4ebb6b7a0b9b40c1275a19b87bb6f46b3bed82a89012cf56dea4024ada"}, + {file = "redis-5.0.5.tar.gz", hash = "sha256:3417688621acf6ee368dec4a04dd95881be24efd34c79f00d31f62bb528800ae"}, ] [package.dependencies] @@ -1865,101 +1852,101 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "regex" -version = "2024.4.28" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61"}, - {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f"}, - {file = "regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea"}, - {file = "regex-2024.4.28-cp310-cp310-win32.whl", hash = "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d"}, - {file = "regex-2024.4.28-cp310-cp310-win_amd64.whl", hash = "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1"}, - {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796"}, - {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb"}, - {file = "regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f"}, - {file = "regex-2024.4.28-cp311-cp311-win32.whl", hash = "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630"}, - {file = "regex-2024.4.28-cp311-cp311-win_amd64.whl", hash = "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90"}, - {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5"}, - {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae"}, - {file = "regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6"}, - {file = "regex-2024.4.28-cp312-cp312-win32.whl", hash = "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17"}, - {file = "regex-2024.4.28-cp312-cp312-win_amd64.whl", hash = "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82"}, - {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6"}, - {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666"}, - {file = "regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150"}, - {file = "regex-2024.4.28-cp38-cp38-win32.whl", hash = "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58"}, - {file = "regex-2024.4.28-cp38-cp38-win_amd64.whl", hash = "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c"}, - {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b"}, - {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae"}, - {file = "regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1"}, - {file = "regex-2024.4.28-cp39-cp39-win32.whl", hash = "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc"}, - {file = "regex-2024.4.28-cp39-cp39-win_amd64.whl", hash = "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962"}, - {file = "regex-2024.4.28.tar.gz", hash = "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -1974,13 +1961,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "responses" -version = "0.25.0" +version = "0.25.2" description = "A utility library for mocking out the `requests` Python library." optional = false python-versions = ">=3.8" files = [ - {file = "responses-0.25.0-py3-none-any.whl", hash = "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a"}, - {file = "responses-0.25.0.tar.gz", hash = "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66"}, + {file = "responses-0.25.2-py3-none-any.whl", hash = "sha256:b59707ea25de536d324670791ab073fafd41f3a351cec9c51cb6147089a9a30a"}, + {file = "responses-0.25.2.tar.gz", hash = "sha256:77a61ad7e6016ed2ac00739b7efa5f35c42351d5b9b5d26bb1be87f197632487"}, ] [package.dependencies] @@ -2125,13 +2112,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -2164,13 +2151,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wagtail" -version = "6.1" +version = "6.1.2" description = "A Django content management system." optional = false python-versions = ">=3.8" files = [ - {file = "wagtail-6.1-py3-none-any.whl", hash = "sha256:6c5ccabc5ac1701e4107241077a880f3fabd34c4ac20bdc412e8961e7b17b4a8"}, - {file = "wagtail-6.1.tar.gz", hash = "sha256:ad33ed1ccad1f9f1b4faba216c6cc92ba1a2dfefdbfd97c23ffbf7db99dd93c5"}, + {file = "wagtail-6.1.2-py3-none-any.whl", hash = "sha256:6858f89c4a050cbbb1702ce3cb605b8360b736c296c93193c4e72ea87427d431"}, + {file = "wagtail-6.1.2.tar.gz", hash = "sha256:fdb82c6cd6f6ae5c1f7b2312166969d8601015b65cbb29ad120efac727d399c1"}, ] [package.dependencies] @@ -2292,40 +2279,43 @@ testing = ["coverage (>=7.4.0)"] [[package]] name = "watchdog" -version = "4.0.0" +version = "4.0.1" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" files = [ - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, - {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, - {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, - {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, - {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, - {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, - {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, - {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, + {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, + {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, + {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, + {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, ] [package.extras]