Compare commits

...

4 commits

4 changed files with 93 additions and 14 deletions

View file

@ -1,16 +1,81 @@
FROM python:3.11-slim # Stage 1: General debian environment
FROM debian:stable-slim AS linux-base
WORKDIR /srv/app # Assure UTF-8 encoding is used.
ENV LC_CTYPE=C.utf8
# Location of the virtual environment
ENV UV_PROJECT_ENVIRONMENT="/venv"
# Location of the python installation via uv
ENV UV_PYTHON_INSTALL_DIR="/python"
# Byte compile the python files on installation
ENV UV_COMPILE_BYTECODE=1
# Python verision to use
ENV UV_PYTHON=python3.12
# Tweaking the PATH variable for easier use
ENV PATH="$UV_PROJECT_ENVIRONMENT/bin:$PATH"
RUN apt update && \ # Update debian
apt install --no-install-recommends -y libpq-dev build-essential curl gcc sassc libpango-1.0-0 libpangoft2-1.0-0 libjpeg-dev libopenjp2-7-dev libffi-dev libpangoft2-1.0-0 libcairo2 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 shared-mime-info gettext &&\ RUN apt-get update
rm -rf /var/lib/apt/lists/* RUN apt-get upgrade -y
COPY --chown=www-data:www-data . . # Install general required dependencies
RUN apt-get install --no-install-recommends -y tzdata \
libpango-1.0-0 \
libpangoft2-1.0-0 \
libjpeg-dev \
libopenjp2-7-dev \
libffi-dev \
libpangoft2-1.0-0 \
libcairo2 \
libpangocairo-1.0-0 \
libgdk-pixbuf2.0-0 \
shared-mime-info \
gettext \
tini
run python -m pip install --upgrade pip \ # Stage 2: Python environment
&& python -m pip install uwsgi \ FROM linux-base AS python-base
&& python -m pip install -r requirements.txt \
&& python -m pip install .
ENTRYPOINT [ "uwsgi", "-i", "uwsgi.ini" ] # Install debian dependencies
RUN apt-get install --no-install-recommends -y \
libpq-dev \
build-essential \
curl \
gcc \
sassc
# Install uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
# Create virtual environment and install dependencies
COPY pyproject.toml ./
COPY uv.lock ./
RUN uv sync --frozen --no-dev --no-install-project
RUN uv pip install granian
# Stage 3: Building environment
FROM python-base AS builder-base
WORKDIR /app
COPY . /app
# Build static files
RUN python manage.py compilescss
RUN python manage.py collectstatic --no-input
# Compile translation files
# RUN python manage.py compilemessages
# Stage 4: Webapp environment
FROM linux-base AS webapp
# Copy python, virtual env and static assets
COPY --from=builder-base $UV_PYTHON_INSTALL_DIR $UV_PYTHON_INSTALL_DIR
COPY --from=builder-base $UV_PROJECT_ENVIRONMENT $UV_PROJECT_ENVIRONMENT
COPY --from=builder-base /app /app
# Start the application server
WORKDIR /app
EXPOSE 8000
CMD ["docker/entrypoint.sh"]

14
docker/entrypoint.sh Executable file
View file

@ -0,0 +1,14 @@
#!/usr/bin/env bash
set -euxo pipefail
echo "Migrate database..."
python manage.py migrate --settings local_settings
echo "Start server..."
granian la_chariotte.wsgi:application \
--host 127.0.0.1 \
--port 8000 \
--interface wsgi \
--no-ws \
--loop uvloop

View file

@ -341,7 +341,7 @@ class ExportGroupOrderEmailAdressesToDownloadView(UserPassesTestMixin, generic.V
response = http.HttpResponse(content_type="text/csv") response = http.HttpResponse(content_type="text/csv")
filename = f"commande _{grouped_order.name.replace(' ', '_')}" filename = f"commande _{grouped_order.name.replace(' ', '_')}"
response["Content-Disposition"] = f'attachment; filename="{filename}.csv"' response["Content-Disposition"] = f'attachment; filename="{filename}.csv"'
writer = csv.writer(response) writer = csv.writer(response, delimiter=";")
for email in email_list: for email in email_list:
writer.writerow([email]) writer.writerow([email])
return response return response
@ -361,7 +361,7 @@ class ExportGroupedOrderToCSVView(GroupedOrderExportView):
"Content-Disposition": f'attachment; filename="{ context["object"].name }-commandes"' "Content-Disposition": f'attachment; filename="{ context["object"].name }-commandes"'
}, },
) )
writer = csv.writer(response) writer = csv.writer(response, delimiter=";")
# write headers rows # write headers rows
row = ["", ""] row = ["", ""]

View file

@ -1629,7 +1629,7 @@ class TestExportGroupedOrderToCSVView:
assert response.status_code == 200 assert response.status_code == 200
content = response.content.decode("utf-8") content = response.content.decode("utf-8")
csv_reader = csv.reader(StringIO(content)) csv_reader = csv.reader(StringIO(content), delimiter=";")
body = list(csv_reader) body = list(csv_reader)
created_date = f"{timezone.now().strftime('%d/%m/%Y')}" created_date = f"{timezone.now().strftime('%d/%m/%Y')}"
created_time = f"{timezone.now().strftime('%H:%M')}" created_time = f"{timezone.now().strftime('%H:%M')}"