Skip to content

Commit 1027639

Browse files
authored
Merge branch 'main' into feature/issue-2645
2 parents 1ee7147 + 2ff96fb commit 1027639

9 files changed

Lines changed: 242 additions & 118 deletions

File tree

.github/dependabot.yml

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,23 @@ updates:
33
- package-ecosystem: pip
44
directory: "/"
55
schedule:
6-
interval: daily
6+
interval: weekly
7+
cooldown:
8+
default-days: 7
79
open-pull-requests-limit: 10
8-
ignore:
9-
- dependency-name: docutils
10-
versions:
11-
- "0.16"
12-
- "0.17"
13-
- dependency-name: responses
14-
versions:
15-
- 0.12.1
16-
- 0.13.0
17-
- 0.13.1
18-
- 0.13.2
19-
- dependency-name: "boto3"
20-
- dependency-name: "boto3-stubs"
21-
- dependency-name: "botocore"
22-
- dependency-name: "botocore-stubs"
23-
- dependency-name: lxml
24-
versions:
25-
- 4.6.2
2610
- package-ecosystem: github-actions
2711
directory: "/"
2812
groups:
2913
github-actions:
3014
patterns:
3115
- "*" # Group all Actions updates into a single larger pull request
3216
schedule:
33-
interval: daily
17+
interval: weekly
18+
cooldown:
19+
default-days: 7
20+
- package-ecosystem: docker
21+
directory: "/"
22+
schedule:
23+
interval: weekly
24+
cooldown:
25+
default-days: 7

Dockerfile

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
FROM ghcr.io/astral-sh/uv:0.11.8@sha256:3b7b60a81d3c57ef471703e5c83fd4aaa33abcd403596fb22ab07db85ae91347 AS uv
2+
13
FROM python:3.12.6-bookworm
24
ENV PYTHONUNBUFFERED=1
35
ENV PYTHONDONTWRITEBYTECODE=1
@@ -32,16 +34,19 @@ RUN case $(uname -m) in \
3234
RUN mkdir /code
3335
WORKDIR /code
3436

35-
RUN pip --no-cache-dir --disable-pip-version-check install --upgrade pip setuptools wheel
37+
COPY --from=uv /uv /uvx /usr/local/bin/
3638

37-
COPY pyproject.toml /code/
39+
COPY pyproject.toml uv.lock /code/
3840

39-
RUN --mount=type=cache,target=/root/.cache/pip \
41+
RUN --mount=type=cache,target=/root/.cache \
4042
set -x \
41-
&& pip --disable-pip-version-check \
42-
install --group dev \
43-
.
43+
&& uv sync \
44+
--frozen \
45+
--no-editable \
46+
--no-install-project
4447

4548
COPY . /code/
4649

47-
RUN pip --disable-pip-version-check install --no-deps -e '.'
50+
RUN uv sync \
51+
--frozen \
52+
--no-editable

Dockerfile.cabotage

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
FROM ghcr.io/astral-sh/uv:0.11.8@sha256:3b7b60a81d3c57ef471703e5c83fd4aaa33abcd403596fb22ab07db85ae91347 AS uv
2+
13
FROM python:3.12.6-bookworm
24
COPY --from=ewdurbin/nginx-static:1.25.x /usr/bin/nginx /usr/bin/nginx
35
ENV PYTHONUNBUFFERED=1
@@ -33,17 +35,28 @@ RUN case $(uname -m) in \
3335
RUN mkdir /code
3436
WORKDIR /code
3537

36-
RUN pip --no-cache-dir --disable-pip-version-check install --upgrade pip setuptools wheel
38+
ENV VIRTUAL_ENV=/code/.venv
39+
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
40+
41+
COPY --from=uv /uv /uvx /usr/local/bin/
3742

38-
COPY pyproject.toml /code/
43+
COPY pyproject.toml uv.lock /code/
3944

40-
RUN --mount=type=cache,target=/root/.cache/pip \
45+
RUN --mount=type=cache,target=/root/.cache \
4146
set -x \
42-
&& pip --disable-pip-version-check \
43-
install \
44-
'.[prod]'
47+
&& uv sync \
48+
--frozen \
49+
--no-editable \
50+
--no-dev \
51+
--extra prod \
52+
--no-install-project
4553

4654
COPY . /code/
4755

48-
RUN pip --disable-pip-version-check install --no-deps '.'
49-
RUN DJANGO_SETTINGS_MODULE=pydotorg.settings.static python manage.py collectstatic --noinput
56+
RUN uv sync \
57+
--frozen \
58+
--no-editable \
59+
--no-dev \
60+
--extra prod
61+
62+
RUN DJANGO_SETTINGS_MODULE=pydotorg.settings.static uv run python manage.py collectstatic --noinput

Makefile

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ help: ## Display this help text
1616
mkdir -p .state && touch .state/db-migrated
1717

1818
.state/db-initialized: .state/docker-build-web .state/db-migrated
19-
docker compose run --rm web ./manage.py createcachetable
20-
docker compose run --rm web ./manage.py loaddata fixtures/*.json
19+
docker compose run --rm web uv run ./manage.py createcachetable
20+
docker compose run --rm web uv run ./manage.py loaddata fixtures/*.json
2121
mkdir -p .state && touch .state/db-initialized
2222

2323
# =============================================================================
@@ -30,16 +30,16 @@ serve: .state/db-initialized ## Start the application
3030
docker compose up --remove-orphans
3131

3232
migrations: .state/db-initialized ## Generate migrations from models
33-
docker compose run --rm web ./manage.py makemigrations
33+
docker compose run --rm web uv run ./manage.py makemigrations
3434

3535
migrate: .state/docker-build-web ## Run Django migrate
36-
docker compose run --rm web ./manage.py migrate
36+
docker compose run --rm web uv run ./manage.py migrate
3737

3838
manage: .state/db-initialized ## Run arbitrary manage.py commands
39-
docker compose run --rm web ./manage.py $(filter-out $@,$(MAKECMDGOALS))
39+
docker compose run --rm web uv run ./manage.py $(filter-out $@,$(MAKECMDGOALS))
4040

4141
shell: .state/db-initialized ## Open Django interactive shell
42-
docker compose run --rm web ./manage.py shell
42+
docker compose run --rm web uv run ./manage.py shell
4343

4444
docker_shell: .state/db-initialized ## Open bash in web container
4545
docker compose run --rm web /bin/bash
@@ -61,7 +61,7 @@ fmt: ## Run ruff formatter
6161
@if command -v ruff >/dev/null 2>&1; then ruff format .; else docker compose run --rm web ruff format .; fi
6262

6363
test: .state/db-initialized ## Run test suite
64-
docker compose run --rm web ./manage.py test
64+
docker compose run --rm web uv run python ./manage.py test
6565

6666
ci: lint fmt test ## Run lint, fmt, then tests
6767

apps/sponsors/api.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,17 @@ def get(self, request, *args, **kwargs):
4545
sponsorships = sponsorships.filter(year=logo_filters.by_year)
4646
for sponsorship in sponsorships.select_related("sponsor").iterator():
4747
sponsor = sponsorship.sponsor
48+
contacts = [
49+
{
50+
"name": c.name,
51+
"email": c.email,
52+
"primary": c.primary,
53+
"administrative": c.administrative,
54+
"accounting": c.accounting,
55+
"manager": c.manager,
56+
}
57+
for c in sponsor.contacts.all()
58+
]
4859
base_data = {
4960
"sponsor_id": sponsor.id,
5061
"sponsor": sponsor.name,
@@ -55,6 +66,7 @@ def get(self, request, *args, **kwargs):
5566
"logo": sponsor.web_logo.url,
5667
"white_logo": sponsor.white_logo.url if sponsor.white_logo else None,
5768
"sponsor_url": sponsor.landing_page_url,
69+
"contacts": contacts,
5870
"start_date": sponsorship.start_date,
5971
"end_date": sponsorship.end_date,
6072
}

apps/sponsors/serializers.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@
66
from apps.sponsors.models.enums import LogoPlacementChoices, PublisherChoices
77

88

9+
class SponsorContactSerializer(serializers.Serializer):
10+
"""Serializer for sponsor contact information."""
11+
12+
name = serializers.CharField()
13+
email = serializers.EmailField()
14+
primary = serializers.BooleanField()
15+
administrative = serializers.BooleanField()
16+
accounting = serializers.BooleanField()
17+
manager = serializers.BooleanField()
18+
19+
920
class LogoPlacementSerializer(serializers.Serializer):
1021
"""Serializer for sponsor logo placement data."""
1122

@@ -22,6 +33,7 @@ class LogoPlacementSerializer(serializers.Serializer):
2233
sponsor_url = serializers.URLField()
2334
level_name = serializers.CharField()
2435
level_order = serializers.IntegerField()
36+
contacts = SponsorContactSerializer(many=True, required=False)
2537

2638

2739
class AssetSerializer(serializers.ModelSerializer):

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ services:
2323
web:
2424
build: .
2525
image: pythondotorg:docker-compose
26-
command: python manage.py runserver 0.0.0.0:8000
26+
command: uv run python manage.py runserver 0.0.0.0:8000
2727
volumes:
2828
- .:/code
2929
ports:
@@ -39,7 +39,7 @@ services:
3939

4040
worker:
4141
image: pythondotorg:docker-compose
42-
command: celery -A pydotorg worker -B -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
42+
command: uv run celery -A pydotorg worker -B -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
4343
volumes:
4444
- .:/code
4545
environment:

pyproject.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ dependencies = [
1616
"django-apptemplates==1.5",
1717
"django-admin-interface==0.28.9",
1818
"django-translation-aliases==0.1.0",
19-
"Django==5.2.11",
19+
"Django==5.2.13",
2020
"docutils==0.21.2",
2121
"Markdown==3.10.2",
2222
"cmarkgfm==2024.11.20",
2323
"Pygments>=2.17,<3",
24-
"Pillow==10.4.0",
24+
"Pillow==12.2.0",
2525
"psycopg2-binary==2.9.11",
2626
"python3-openid==3.2.0",
2727
"python-decouple==3.8",
28-
"lxml==5.2.2",
28+
"lxml==6.1.0",
2929
"cssselect==1.2.0",
3030
"feedparser==6.0.11",
3131
"beautifulsoup4==4.12.3",
@@ -64,7 +64,7 @@ prod = [
6464
"sentry-sdk[django]==2.53.0",
6565
"Whitenoise==6.11.0",
6666
"django-storages==1.14.6",
67-
"boto3==1.26.165",
67+
"boto3==1.43.4",
6868
]
6969

7070
[dependency-groups]

0 commit comments

Comments
 (0)