Merge branch 'main' into storefront-nuxt
This commit is contained in:
commit
04fa776623
28 changed files with 3921 additions and 5517 deletions
|
|
@ -27,6 +27,7 @@ cython_debug/
|
|||
|
||||
# Python environments
|
||||
.Python
|
||||
.python-version
|
||||
env/
|
||||
env.bak/
|
||||
venv/
|
||||
|
|
|
|||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -27,6 +27,7 @@ venv.bak/
|
|||
ENV/
|
||||
.venv/
|
||||
__pypackages__/
|
||||
.python-version
|
||||
|
||||
# Local Django settings and database
|
||||
local_settings.py
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ docker-compose.yml @@maintainer
|
|||
.dockerignore @@maintainer
|
||||
nginx @@maintainer
|
||||
pyproject.toml @fureunoir contact@fureunoir.com
|
||||
poetry.lock @fureunoir contact@fureunoir.com
|
||||
uv.lock @fureunoir contact@fureunoir.com
|
||||
|
||||
*.py @fureunoir contact@fureunoir.com
|
||||
*.bat @fureunoir contact@fureunoir.com
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# syntax=docker/dockerfile:1
|
||||
FROM python:3.12-bookworm
|
||||
FROM python:3.12-slim-bookworm
|
||||
LABEL authors="fureunoir"
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
|
|
@ -13,7 +13,7 @@ WORKDIR /app
|
|||
RUN set -eux; \
|
||||
sed -i 's|https://deb.debian.org/debian|https://ftp.uk.debian.org/debian|g' /etc/apt/sources.list.d/debian.sources; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends wget gnupg; \
|
||||
apt-get install -y --no-install-recommends wget gnupg curl; \
|
||||
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -; \
|
||||
echo "deb http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" \
|
||||
> /etc/apt/sources.list.d/pgdg.list; \
|
||||
|
|
@ -33,14 +33,21 @@ RUN set -eux; \
|
|||
postgresql-client-17 \
|
||||
gdal-bin; \
|
||||
rm -rf /var/lib/apt/lists/*; \
|
||||
pip install --upgrade pip; \
|
||||
curl -sSL https://install.python-poetry.org | python3
|
||||
pip install --upgrade pip
|
||||
|
||||
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
ENV PATH="/root/.local/bin:/root/.cargo/bin:$PATH"
|
||||
|
||||
RUN uv venv /opt/evibes-python
|
||||
ENV VIRTUAL_ENV=/opt/evibes-python
|
||||
ENV UV_PROJECT_ENVIRONMENT=/opt/evibes-python
|
||||
ENV PATH="/opt/evibes-python/bin:/root/.local/bin:/root/.cargo/bin:$PATH"
|
||||
|
||||
COPY pyproject.toml pyproject.toml
|
||||
COPY poetry.lock poetry.lock
|
||||
COPY uv.lock uv.lock
|
||||
|
||||
RUN poetry config virtualenvs.create false
|
||||
RUN poetry install --extras="graph worker openai testing" --no-interaction --no-ansi
|
||||
RUN set -eux; \
|
||||
uv sync --extra graph --extra worker --extra openai --extra testing --locked
|
||||
|
||||
COPY ./scripts/Docker/app-entrypoint.sh /usr/local/bin/app-entrypoint.sh
|
||||
RUN chmod +x /usr/local/bin/app-entrypoint.sh
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# syntax=docker/dockerfile:1
|
||||
FROM python:3.12-bookworm
|
||||
FROM python:3.12-slim-bookworm
|
||||
LABEL authors="fureunoir"
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
|
|
@ -13,7 +13,7 @@ WORKDIR /app
|
|||
RUN set -eux; \
|
||||
sed -i 's|https://deb.debian.org/debian|https://ftp.uk.debian.org/debian|g' /etc/apt/sources.list.d/debian.sources; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends wget gnupg; \
|
||||
apt-get install -y --no-install-recommends wget gnupg curl; \
|
||||
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -; \
|
||||
echo "deb http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" \
|
||||
> /etc/apt/sources.list.d/pgdg.list; \
|
||||
|
|
@ -33,14 +33,21 @@ RUN set -eux; \
|
|||
postgresql-client-17 \
|
||||
gdal-bin; \
|
||||
rm -rf /var/lib/apt/lists/*; \
|
||||
pip install --upgrade pip; \
|
||||
curl -sSL https://install.python-poetry.org | python3
|
||||
pip install --upgrade pip
|
||||
|
||||
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
ENV PATH="/root/.local/bin:/root/.cargo/bin:$PATH"
|
||||
ENV UV_PROJECT_ENVIRONMENT=/opt/evibes-python
|
||||
ENV PATH="/opt/evibes-python/bin:/root/.local/bin:/root/.cargo/bin:$PATH"
|
||||
|
||||
RUN uv venv /opt/evibes-python
|
||||
ENV VIRTUAL_ENV=/opt/evibes-python
|
||||
|
||||
COPY pyproject.toml pyproject.toml
|
||||
COPY poetry.lock poetry.lock
|
||||
COPY uv.lock uv.lock
|
||||
|
||||
RUN poetry config virtualenvs.create false
|
||||
RUN poetry install --extras="worker openai" --no-interaction --no-ansi
|
||||
RUN set -eux; \
|
||||
uv sync --extra worker --extra openai --locked
|
||||
|
||||
COPY ./scripts/Docker/beat-entrypoint.sh /usr/local/bin/beat-entrypoint.sh
|
||||
RUN chmod +x /usr/local/bin/beat-entrypoint.sh
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# syntax=docker/dockerfile:1
|
||||
FROM python:3.12-bookworm
|
||||
FROM python:3.12-slim-bookworm
|
||||
LABEL authors="fureunoir"
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
|
|
@ -13,7 +13,7 @@ WORKDIR /app
|
|||
RUN set -eux; \
|
||||
sed -i 's|https://deb.debian.org/debian|https://ftp.uk.debian.org/debian|g' /etc/apt/sources.list.d/debian.sources; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends wget gnupg; \
|
||||
apt-get install -y --no-install-recommends wget gnupg curl; \
|
||||
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -; \
|
||||
echo "deb http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" \
|
||||
> /etc/apt/sources.list.d/pgdg.list; \
|
||||
|
|
@ -33,14 +33,21 @@ RUN set -eux; \
|
|||
postgresql-client-17 \
|
||||
gdal-bin; \
|
||||
rm -rf /var/lib/apt/lists/*; \
|
||||
pip install --upgrade pip; \
|
||||
curl -sSL https://install.python-poetry.org | python3
|
||||
pip install --upgrade pip
|
||||
|
||||
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
ENV PATH="/root/.local/bin:/root/.cargo/bin:$PATH"
|
||||
ENV UV_PROJECT_ENVIRONMENT=/opt/evibes-python
|
||||
ENV PATH="/opt/evibes-python/bin:/root/.local/bin:/root/.cargo/bin:$PATH"
|
||||
|
||||
RUN uv venv /opt/evibes-python
|
||||
ENV VIRTUAL_ENV=/opt/evibes-python
|
||||
|
||||
COPY pyproject.toml pyproject.toml
|
||||
COPY poetry.lock poetry.lock
|
||||
COPY uv.lock uv.lock
|
||||
|
||||
RUN poetry config virtualenvs.create false
|
||||
RUN poetry install --extras="worker openai" --no-interaction --no-ansi
|
||||
RUN set -eux; \
|
||||
uv sync --extra worker --extra openai --locked
|
||||
|
||||
COPY ./scripts/Docker/stock-updater-entrypoint.sh /usr/local/bin/stock-updater-entrypoint.sh
|
||||
RUN chmod +x /usr/local/bin/stock-updater-entrypoint.sh
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# syntax=docker/dockerfile:1
|
||||
FROM python:3.12-bookworm
|
||||
FROM python:3.12-slim-bookworm
|
||||
LABEL authors="fureunoir"
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
|
|
@ -13,7 +13,7 @@ WORKDIR /app
|
|||
RUN set -eux; \
|
||||
sed -i 's|https://deb.debian.org/debian|https://ftp.uk.debian.org/debian|g' /etc/apt/sources.list.d/debian.sources; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends wget gnupg; \
|
||||
apt-get install -y --no-install-recommends wget gnupg curl; \
|
||||
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -; \
|
||||
echo "deb http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" \
|
||||
> /etc/apt/sources.list.d/pgdg.list; \
|
||||
|
|
@ -33,14 +33,21 @@ RUN set -eux; \
|
|||
postgresql-client-17 \
|
||||
gdal-bin; \
|
||||
rm -rf /var/lib/apt/lists/*; \
|
||||
pip install --upgrade pip; \
|
||||
curl -sSL https://install.python-poetry.org | python3
|
||||
pip install --upgrade pip
|
||||
|
||||
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
ENV PATH="/root/.local/bin:/root/.cargo/bin:$PATH"
|
||||
|
||||
RUN uv venv /opt/evibes-python
|
||||
ENV VIRTUAL_ENV=/opt/evibes-python
|
||||
ENV UV_PROJECT_ENVIRONMENT=/opt/evibes-python
|
||||
ENV PATH="/opt/evibes-python/bin:/root/.local/bin:/root/.cargo/bin:$PATH"
|
||||
|
||||
COPY pyproject.toml pyproject.toml
|
||||
COPY poetry.lock poetry.lock
|
||||
COPY uv.lock uv.lock
|
||||
|
||||
RUN poetry config virtualenvs.create false
|
||||
RUN poetry install --extras="worker openai" --no-interaction --no-ansi
|
||||
RUN set -eux; \
|
||||
uv sync --extra worker --extra openai --locked
|
||||
|
||||
COPY ./scripts/Docker/worker-entrypoint.sh /usr/local/bin/worker-entrypoint.sh
|
||||
RUN chmod +x /usr/local/bin/worker-entrypoint.sh
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import re
|
||||
from typing import Any
|
||||
|
||||
from blib2to3.pgen2.parse import Callable
|
||||
from typing import Callable
|
||||
from django.conf import settings
|
||||
from django.db.models import QuerySet
|
||||
from django.http import Http404
|
||||
|
|
|
|||
46
core/migrations/0049_alter_attribute_unique_together.py
Normal file
46
core/migrations/0049_alter_attribute_unique_together.py
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
# Generated by Django 5.2.7 on 2025-10-24 23:17
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("core", "0048_vendor_integration_path_alter_productimage_priority"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterUniqueTogether(
|
||||
name="attribute",
|
||||
unique_together={
|
||||
("name", "group", "value_type"),
|
||||
("name_ar_ar", "group", "value_type"),
|
||||
("name_cs_cz", "group", "value_type"),
|
||||
("name_da_dk", "group", "value_type"),
|
||||
("name_de_de", "group", "value_type"),
|
||||
("name_en_gb", "group", "value_type"),
|
||||
("name_en_us", "group", "value_type"),
|
||||
("name_es_es", "group", "value_type"),
|
||||
("name_fa_ir", "group", "value_type"),
|
||||
("name_fr_fr", "group", "value_type"),
|
||||
("name_he_il", "group", "value_type"),
|
||||
("name_hi_in", "group", "value_type"),
|
||||
("name_hr_hr", "group", "value_type"),
|
||||
("name_id_id", "group", "value_type"),
|
||||
("name_it_it", "group", "value_type"),
|
||||
("name_ja_jp", "group", "value_type"),
|
||||
("name_kk_kz", "group", "value_type"),
|
||||
("name_ko_kr", "group", "value_type"),
|
||||
("name_nl_nl", "group", "value_type"),
|
||||
("name_no_no", "group", "value_type"),
|
||||
("name_pl_pl", "group", "value_type"),
|
||||
("name_pt_br", "group", "value_type"),
|
||||
("name_ro_ro", "group", "value_type"),
|
||||
("name_ru_ru", "group", "value_type"),
|
||||
("name_sv_se", "group", "value_type"),
|
||||
("name_th_th", "group", "value_type"),
|
||||
("name_tr_tr", "group", "value_type"),
|
||||
("name_vi_vn", "group", "value_type"),
|
||||
("name_zh_hans", "group", "value_type"),
|
||||
},
|
||||
),
|
||||
]
|
||||
|
|
@ -47,6 +47,7 @@ services:
|
|||
container_name: postgres_exporter
|
||||
image: quay.io/prometheuscommunity/postgres-exporter:v0.17.0
|
||||
restart: always
|
||||
profiles: ["monitoring"]
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
|
|
@ -76,6 +77,7 @@ services:
|
|||
container_name: redis_exporter
|
||||
image: oliver006/redis_exporter:v1.73.0
|
||||
restart: always
|
||||
profiles: ["monitoring"]
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
|
|
@ -111,6 +113,7 @@ services:
|
|||
container_name: elasticsearch_exporter
|
||||
image: quay.io/prometheuscommunity/elasticsearch-exporter:v1.9.0
|
||||
restart: always
|
||||
profiles: ["monitoring"]
|
||||
env_file:
|
||||
- .env
|
||||
command:
|
||||
|
|
@ -194,13 +197,9 @@ services:
|
|||
depends_on:
|
||||
database:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
logging: *default-logging
|
||||
healthcheck:
|
||||
test: [ "CMD", "bash", "-c", "pgrep -f 'celery beat' >/dev/null" ]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 15s
|
||||
|
||||
prometheus:
|
||||
container_name: prometheus
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ class GatewayQuerySet(QuerySet):
|
|||
return self.annotate(
|
||||
daily_sum=Coalesce(Sum("transactions__amount", filter=Q(transactions__created__date=today)), Value(0.0)),
|
||||
monthly_sum=Coalesce(
|
||||
Sum("transactions__amount", filter=Q(transactions__created__gte=current_month_start)), Value(0.0)
|
||||
Sum("transactions__amount", filter=Q(transactions__created__date__gte=current_month_start)), Value(0.0)
|
||||
),
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
# Generated by Django 5.2.7 on 2025-10-24 23:17
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("core", "0049_alter_attribute_unique_together"),
|
||||
("payments", "0005_gateway_transaction_gateway"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddIndex(
|
||||
model_name="transaction",
|
||||
index=models.Index(fields=["created"], name="payments_tr_created_95e595_idx"),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
from datetime import datetime, time
|
||||
from typing import Type
|
||||
|
||||
from constance import config
|
||||
|
|
@ -13,8 +14,9 @@ from django.db.models import (
|
|||
PositiveIntegerField,
|
||||
QuerySet,
|
||||
Sum,
|
||||
Index,
|
||||
)
|
||||
from django.utils.timezone import now
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from core.abstract import NiceModel
|
||||
|
|
@ -64,6 +66,7 @@ class Transaction(NiceModel):
|
|||
verbose_name_plural = _("transactions")
|
||||
indexes = [
|
||||
GinIndex(fields=["process"]),
|
||||
Index(fields=["created"]),
|
||||
]
|
||||
|
||||
|
||||
|
|
@ -143,18 +146,26 @@ class Gateway(NiceModel):
|
|||
if not self.is_active:
|
||||
return False
|
||||
|
||||
today = now().date()
|
||||
current_month_start = today.replace(day=1)
|
||||
today = timezone.localdate()
|
||||
|
||||
tz = timezone.get_current_timezone()
|
||||
month_start = timezone.make_aware(datetime.combine(today.replace(day=1), time.min), tz)
|
||||
if today.month == 12:
|
||||
next_month_date = today.replace(year=today.year + 1, month=1, day=1)
|
||||
else:
|
||||
next_month_date = today.replace(month=today.month + 1, day=1)
|
||||
month_end = timezone.make_aware(datetime.combine(next_month_date, time.min), tz)
|
||||
|
||||
daily_sum = self.transactions.filter(created__date=today).aggregate(total=Sum("amount"))["total"] or 0
|
||||
|
||||
monthly_sum = (
|
||||
self.transactions.filter(created__gte=current_month_start).aggregate(total=Sum("amount"))["total"] or 0
|
||||
self.transactions.filter(created__gte=month_start, created__lt=month_end).aggregate(total=Sum("amount"))[
|
||||
"total"
|
||||
]
|
||||
or 0
|
||||
)
|
||||
|
||||
daily_ok = self.daily_limit == 0 or daily_sum < self.daily_limit
|
||||
monthly_ok = self.monthly_limit == 0 or monthly_sum < self.monthly_limit
|
||||
|
||||
return daily_ok and monthly_ok
|
||||
|
||||
@can_be_used.setter
|
||||
|
|
|
|||
5343
poetry.lock
generated
5343
poetry.lock
generated
File diff suppressed because it is too large
Load diff
195
pyproject.toml
195
pyproject.toml
|
|
@ -1,106 +1,105 @@
|
|||
[tool.poetry]
|
||||
[project]
|
||||
name = "eVibes"
|
||||
version = "3.1.0"
|
||||
description = "eVibes — your store without the extra baggage. Everything works out of the box: storefront, product catalog, cart, and orders. Minimal complexity, maximum flexibility — install, adjust to your needs, and start selling."
|
||||
authors = ["fureunoir <contact@fureunoir.com>"]
|
||||
authors = [{ name = "fureunoir", email = "contact@fureunoir.com" }]
|
||||
readme = "README.md"
|
||||
package-mode = false
|
||||
requires-python = ">=3.12,<=3.13"
|
||||
dependencies = [
|
||||
"aiosmtpd==1.4.6",
|
||||
"colorlog==6.10.1",
|
||||
"click==8.3.0",
|
||||
"cryptography==46.0.3",
|
||||
"django==5.2.7",
|
||||
"django-cacheops==7.2",
|
||||
"django-constance==4.3.2",
|
||||
"django-cors-headers==4.9.0",
|
||||
"django-dbbackup==5.0.0",
|
||||
"django-elasticsearch-dsl==8.2",
|
||||
"django-extensions==4.1",
|
||||
"django-filter==25.2",
|
||||
"django-health-check==3.20.0",
|
||||
"django-hosts==7.0.0",
|
||||
"django-jazzmin==3.0.1",
|
||||
"django-json-widget==2.1.0",
|
||||
"django-mailbox==4.10.1",
|
||||
"django-model-utils==5.0.0",
|
||||
"django-modeltranslation==0.19.17",
|
||||
"django-mptt==0.18.0",
|
||||
"django-prometheus==2.4.1",
|
||||
"django-redis==6.0.0",
|
||||
"django-ratelimit==4.1.0",
|
||||
"django-storages==1.14.6",
|
||||
"django-stubs==5.2.7",
|
||||
"django-summernote==0.8.20.0",
|
||||
"django-widget-tweaks==1.5.0",
|
||||
"django-md-field==0.1.0",
|
||||
"djangorestframework==3.16.1",
|
||||
"djangorestframework-camel-case==1.4.2",
|
||||
"djangorestframework-recursive==0.1.2",
|
||||
"djangorestframework-simplejwt[crypto]==5.5.1",
|
||||
"djangorestframework-stubs==3.16.5",
|
||||
"djangorestframework-xml==2.0.0",
|
||||
"djangorestframework-yaml==2.0.0",
|
||||
"docutils==0.22.2",
|
||||
"drf-spectacular[sidecar]==0.28.0",
|
||||
"elasticsearch-dsl==8.18.0",
|
||||
"filelock==3.20.0",
|
||||
"filetype==1.2.0",
|
||||
"graphene-django==3.2.3",
|
||||
"graphene-file-upload==1.3.0",
|
||||
"gunicorn==23.0.0",
|
||||
"httpx==0.28.1",
|
||||
"paramiko==4.0.0",
|
||||
"pillow==12.0.0",
|
||||
"polib==1.2.0",
|
||||
"PyJWT==2.10.1",
|
||||
"python-slugify==8.0.4",
|
||||
"psutil==7.1.1",
|
||||
"psycopg2==2.9.11",
|
||||
"pydantic==2.12.3",
|
||||
"pymdown-extensions==10.16.1",
|
||||
"redis==7.0.0",
|
||||
"requests==2.32.5",
|
||||
"sentry-sdk[django,celery,opentelemetry]==2.42.1",
|
||||
"six==1.17.0",
|
||||
"swapper==1.4.0",
|
||||
"zeep==4.3.2",
|
||||
"pip>=25.2",
|
||||
"coverage>=7.11.0",
|
||||
]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
aiosmtpd = "1.4.6"
|
||||
celery = { version = "5.5.3", optional = true }
|
||||
celery-prometheus-exporter = { version = "1.7.0", optional = true }
|
||||
colorlog = "6.9.0"
|
||||
click = "8.2.1"
|
||||
cryptography = "45.0.4"
|
||||
django = "5.2"
|
||||
django-cacheops = "7.2"
|
||||
django-celery-beat = { version = "2.8.1", optional = true }
|
||||
django-celery-results = { version = "2.6.0", optional = true }
|
||||
django-constance = "4.3.2"
|
||||
django-cors-headers = "4.7.0"
|
||||
django-dbbackup = "4.3.0"
|
||||
django-elasticsearch-dsl = "8.0"
|
||||
django-elasticsearch-dsl-drf = "0.22.5"
|
||||
django-extensions = "4.1"
|
||||
django-filter = "25.1"
|
||||
django-health-check = "3.20.0"
|
||||
django-hosts = "6.0"
|
||||
django-jazzmin = "3.0.1"
|
||||
django-json-widget = "2.0.1"
|
||||
django-mailbox = "4.10.1"
|
||||
django-model-utils = "5.0.0"
|
||||
django-modeltranslation = "0.19.15"
|
||||
django-mptt = "0.17.0"
|
||||
django-prometheus = "2.3.1"
|
||||
django-redis = "6.0.0"
|
||||
django-ratelimit = "4.1.0"
|
||||
django-storages = "1.14.6"
|
||||
django-stubs = "5.2.1"
|
||||
django-summernote = "0.8.20.0"
|
||||
django-widget-tweaks = "1.5.0"
|
||||
django-md-field = "0.1.0"
|
||||
djangorestframework = "3.16.0"
|
||||
djangorestframework-camel-case = "1.4.2"
|
||||
djangorestframework-recursive = "0.1.2"
|
||||
djangorestframework-simplejwt = { extras = ["crypto"], version = "5.5.0" }
|
||||
djangorestframework-stubs = "3.16.0"
|
||||
djangorestframework-xml = "2.0.0"
|
||||
djangorestframework-yaml = "2.0.0"
|
||||
docutils = "0.21.2"
|
||||
drf-spectacular = { extras = ["sidecar"], version = "0.28.0" }
|
||||
elasticsearch = "8.18.1"
|
||||
elasticsearch-dsl = "8.18.0"
|
||||
filelock = "3.18.0"
|
||||
filetype = "1.2.0"
|
||||
graphene-django = "3.2.3"
|
||||
graphene-file-upload = "1.3.0"
|
||||
gunicorn = "23.0.0"
|
||||
httpx = "0.28.1"
|
||||
jupyter = { version = "1.1.1", optional = true }
|
||||
mypy = "1.16.1"
|
||||
openai = { version = "1.88.0", optional = true }
|
||||
paramiko = "3.5.1"
|
||||
pillow = "11.2.1"
|
||||
polib = "1.2.0"
|
||||
poetry-core = "2.1.3"
|
||||
PyJWT = "2.9.0"
|
||||
python = ">=3.12,<3.13"
|
||||
python-slugify = "8.0.4"
|
||||
psutil = "6.1.1"
|
||||
psycopg2 = "2.9.10"
|
||||
pydantic = "2.9.2"
|
||||
pygraphviz = { version = "1.14", optional = true, markers = "sys_platform != 'win32'" }
|
||||
pymdown-extensions = "10.15"
|
||||
redis = "6.2.0"
|
||||
requests = "2.32.4"
|
||||
ruff = "0.12.0"
|
||||
sentry-sdk = { extras = ["django", "celery", "opentelemetry", "redis"], version = "2.27.0" }
|
||||
six = "1.17.0"
|
||||
swapper = "1.4.0"
|
||||
yapf = "0.43.0"
|
||||
zeep = "4.3.1"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
black = "25.1.0"
|
||||
celery-stubs = "0.1.3"
|
||||
isort = "6.0.1"
|
||||
flake8 = "7.2.0"
|
||||
mypy-extensions = "1.1.0"
|
||||
pytest = "8.4.1"
|
||||
pytest-django = "4.11.1"
|
||||
coverage = "7.9.1"
|
||||
pre-commit = "4.2.0"
|
||||
bandit = "1.8.5"
|
||||
|
||||
[tool.poetry.extras]
|
||||
graph = ["pygraphviz"]
|
||||
worker = ["celery", "django-celery-beat", "django-celery-results", "celery-prometheus-exporter"]
|
||||
openai = ["openai"]
|
||||
jupyter = ["jupyter"]
|
||||
[project.optional-dependencies]
|
||||
testing = ["pytest==8.4.2", "pytest-django==4.11.1", "coverage==7.11.0"]
|
||||
graph = ["pygraphviz==1.14; sys_platform != 'win32'"]
|
||||
worker = [
|
||||
"celery==5.5.3",
|
||||
"django-celery-beat==2.8.1",
|
||||
"django-celery-results==2.6.0",
|
||||
"celery-prometheus-exporter==1.7.0",
|
||||
]
|
||||
openai = ["openai==2.6.1"]
|
||||
jupyter = ["jupyter==1.1.1"]
|
||||
docs = ["sphinx", "sphinx-rtd-theme", "m2r2"]
|
||||
testing = ["pytest", "pytest-django", "coverage"]
|
||||
linting = ["black", "isort", "flake8", "bandit"]
|
||||
|
||||
[dependency-groups]
|
||||
testing = ["pytest==8.4.2", "pytest-django==4.11.1", "coverage==7.11.0"]
|
||||
linting = [
|
||||
"isort==7.0.0",
|
||||
"bandit==1.8.6",
|
||||
"pre-commit==4.3.0",
|
||||
"mypy==1.18.2",
|
||||
"mypy-extensions==1.1.0",
|
||||
"ruff==0.14.2",
|
||||
"celery-stubs==0.1.3",
|
||||
]
|
||||
dev = [{ include-group = "testing" }, { include-group = "linting" }]
|
||||
|
||||
[tool.uv]
|
||||
package = false
|
||||
|
||||
[tool.uv.pip]
|
||||
python-version = "3.12"
|
||||
|
||||
[tool.mypy]
|
||||
strict = false
|
||||
|
|
@ -122,4 +121,4 @@ ignore = ["RUF012", "A002", "A003"]
|
|||
|
||||
[tool.ruff.format]
|
||||
quote-style = "double"
|
||||
indent-style = "space"
|
||||
indent-style = "space"
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@
|
|||
set -e
|
||||
|
||||
# wait for auxiliary services
|
||||
poetry run python manage.py await_services
|
||||
uv run python manage.py await_services
|
||||
|
||||
# choose dev vs prod
|
||||
if [ "${DEBUG:-0}" = "1" ]; then
|
||||
exec poetry run gunicorn evibes.wsgi:application \
|
||||
uv run gunicorn evibes.wsgi:application \
|
||||
--bind 0.0.0.0:8000 \
|
||||
--workers 2 \
|
||||
--reload \
|
||||
|
|
@ -14,7 +14,7 @@ if [ "${DEBUG:-0}" = "1" ]; then
|
|||
--access-logfile - \
|
||||
--error-logfile -
|
||||
else
|
||||
exec poetry run gunicorn evibes.wsgi:application \
|
||||
uv run gunicorn evibes.wsgi:application \
|
||||
--bind 0.0.0.0:8000 \
|
||||
--workers 12 \
|
||||
--timeout 120
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
set -e
|
||||
|
||||
# wait for auxiliary services
|
||||
poetry run python manage.py await_services
|
||||
uv run python manage.py await_services
|
||||
|
||||
# run beat
|
||||
poetry run celery -A evibes beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
|
||||
uv run celery -A evibes beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
set -e
|
||||
|
||||
# wait for auxiliary services
|
||||
poetry run python manage.py await_services
|
||||
uv run python manage.py await_services
|
||||
|
||||
# run stock_updater
|
||||
poetry run celery -A evibes worker --pool=prefork --concurrency=1 --queues=stock_updater --loglevel=info --max-tasks-per-child=1
|
||||
uv run celery -A evibes worker --pool=prefork --concurrency=1 --queues=stock_updater --loglevel=info --max-tasks-per-child=1
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
set -e
|
||||
|
||||
# wait for auxiliary services
|
||||
poetry run python manage.py await_services
|
||||
uv run python manage.py await_services
|
||||
|
||||
# run worker and metrics exporter
|
||||
poetry run celery -A evibes worker --pool=prefork --concurrency=8 --loglevel=info -E --queues=default --prefetch-multiplier=1 --max-tasks-per-child=100 --max-memory-per-child=512000 --soft-time-limit=3600 --time-limit=7200 & /usr/local/bin/celery-prometheus-exporter
|
||||
uv run celery -A evibes worker --pool=prefork --concurrency=8 --loglevel=info -E --queues=default --prefetch-multiplier=1 --max-tasks-per-child=100 --max-memory-per-child=512000 --soft-time-limit=3600 --time-limit=7200 & /opt/evibes-python/bin/celery-prometheus-exporter
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@ set -euo pipefail
|
|||
source ./scripts/Unix/starter.sh
|
||||
|
||||
echo "Starting database backup process..."
|
||||
docker compose exec app poetry run python manage.py dbbackup
|
||||
docker compose exec app uv run python manage.py dbbackup
|
||||
echo "Database backup created under ./dbbackup"
|
||||
|
||||
echo "Starting media backup process..."
|
||||
docker compose exec app poetry run python manage.py mediabackup
|
||||
docker compose exec app uv run python manage.py mediabackup
|
||||
echo "Media backup created under ./dbbackup"
|
||||
|
|
|
|||
|
|
@ -12,19 +12,19 @@ docker compose up -d --build --wait
|
|||
echo "Services are up and healthy!"
|
||||
|
||||
echo "Applying migrations..."
|
||||
docker compose exec app poetry run python manage.py migrate --no-input --verbosity 0
|
||||
docker compose exec app uv run python manage.py migrate --no-input --verbosity 0
|
||||
echo "Migrations applied successfully!"
|
||||
|
||||
echo "Collecting static files..."
|
||||
docker compose exec app poetry run python manage.py collectstatic --clear --no-input --verbosity 0
|
||||
docker compose exec app uv run python manage.py collectstatic --clear --no-input --verbosity 0
|
||||
echo "Static files collected successfully!"
|
||||
|
||||
echo "Setting default caches..."
|
||||
docker compose exec app poetry run python manage.py set_default_caches
|
||||
docker compose exec app uv run python manage.py set_default_caches
|
||||
echo "Default caches set successfully!"
|
||||
|
||||
echo "Building search Index..."
|
||||
docker compose exec app poetry run python manage.py search_index --rebuild -f
|
||||
docker compose exec app uv run python manage.py search_index --rebuild -f
|
||||
echo "Search Index built successfully!"
|
||||
|
||||
echo "Cleaning up unused Docker data..."
|
||||
|
|
|
|||
|
|
@ -18,15 +18,15 @@ docker compose up --no-build --detach --wait
|
|||
echo "Services are up and healthy!"
|
||||
|
||||
echo "Applying migrations…"
|
||||
docker compose exec app poetry run python manage.py migrate --no-input
|
||||
docker compose exec app uv run python manage.py migrate --no-input
|
||||
echo "Migrations applied successfully!"
|
||||
|
||||
echo "Collecting static files…"
|
||||
docker compose exec app poetry run python manage.py collectstatic --clear --no-input
|
||||
docker compose exec app uv run python manage.py collectstatic --clear --no-input
|
||||
echo "Static files collected successfully!"
|
||||
|
||||
echo "Setting default caches…"
|
||||
docker compose exec app poetry run python manage.py set_default_caches
|
||||
docker compose exec app uv run python manage.py set_default_caches
|
||||
echo "Default caches set successfully!"
|
||||
|
||||
echo "Cleaning unused Docker data…"
|
||||
|
|
|
|||
|
|
@ -8,14 +8,14 @@ if ($LASTEXITCODE -ne 0) {
|
|||
}
|
||||
|
||||
Write-Host "Starting database backup process..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py dbbackup
|
||||
docker compose exec app uv run python manage.py dbbackup
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "Database backup created under ./dbbackup" -ForegroundColor Green
|
||||
|
||||
Write-Host "Starting media backup process..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py mediabackup
|
||||
docker compose exec app uv run python manage.py mediabackup
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,14 +13,14 @@ if (-not (Test-Path '.env'))
|
|||
}
|
||||
|
||||
Write-Host "Checking placeholders in PO files..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py check_translated -l ALL -a ALL
|
||||
docker compose exec app uv run python manage.py check_translated -l ALL -a ALL
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "PO files have no placeholder issues!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Compiling PO files into MO files..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py compilemessages -l ar_AR -l cs_CZ -l da_DK -l de_DE -l en_GB -l en_US -l es_ES -l fa_IR -l fr_FR -l he_IL -l hi_IN -l hr_HR -l id_ID -l it_IT -l ja_JP -l kk_KZ -l ko_KR -l nl_NL -l no_NO -l pl_PL -l pt_BR -l ro_RO -l ru_RU -l sv_SE -l th_TH -l tr_TR -l vi_VN -l zh_Hans
|
||||
docker compose exec app uv run python manage.py compilemessages -l ar_AR -l cs_CZ -l da_DK -l de_DE -l en_GB -l en_US -l es_ES -l fa_IR -l fr_FR -l he_IL -l hi_IN -l hr_HR -l id_ID -l it_IT -l ja_JP -l kk_KZ -l ko_KR -l nl_NL -l no_NO -l pl_PL -l pt_BR -l ro_RO -l ru_RU -l sv_SE -l th_TH -l tr_TR -l vi_VN -l zh_Hans
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,28 +13,28 @@ if (-not (Test-Path '.env'))
|
|||
}
|
||||
|
||||
Write-Host "Remove old fuzzy entries..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py fix_fuzzy
|
||||
docker compose exec app uv run python manage.py fix_fuzzy
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "Old fuzzy entries removed successfully!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Updating PO files..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py makemessages -l ar_AR -l cs_CZ -l da_DK -l de_DE -l en_GB -l en_US -l es_ES -l fa_IR -l fr_FR -l he_IL -l hi_IN -l hr_HR -l id_ID -l it_IT -l ja_JP -l kk_KZ -l ko_KR -l nl_NL -l no_NO -l pl_PL -l pt_BR -l ro_RO -l ru_RU -l sv_SE -l th_TH -l tr_TR -l vi_VN -l zh_Hans
|
||||
docker compose exec app uv run python manage.py makemessages -l ar_AR -l cs_CZ -l da_DK -l de_DE -l en_GB -l en_US -l es_ES -l fa_IR -l fr_FR -l he_IL -l hi_IN -l hr_HR -l id_ID -l it_IT -l ja_JP -l kk_KZ -l ko_KR -l nl_NL -l no_NO -l pl_PL -l pt_BR -l ro_RO -l ru_RU -l sv_SE -l th_TH -l tr_TR -l vi_VN -l zh_Hans
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "PO files updated successfully!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Fixing new fuzzy entries..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py fix_fuzzy
|
||||
docker compose exec app uv run python manage.py fix_fuzzy
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "New fuzzy entries fixed successfully!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Translating with DeepL..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py deepl_translate -l ALL -a ALL
|
||||
docker compose exec app uv run python manage.py deepl_translate -l ALL -a ALL
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,28 +22,28 @@ if ($LASTEXITCODE -ne 0) {
|
|||
Write-Host "Services are up and healthy!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Applying migrations..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py migrate --no-input --verbosity 0
|
||||
docker compose exec app uv run python manage.py migrate --no-input --verbosity 0
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "Migrations applied successfully!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Collecting static files..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py collectstatic --clear --no-input --verbosity 0
|
||||
docker compose exec app uv run python manage.py collectstatic --clear --no-input --verbosity 0
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "Static files collected successfully!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Setting default caches..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py set_default_caches
|
||||
docker compose exec app uv run python manage.py set_default_caches
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "Default caches set successfully!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Building search Index..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py search_index --rebuild -f
|
||||
docker compose exec app uv run python manage.py search_index --rebuild -f
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,21 +38,21 @@ if ($LASTEXITCODE -ne 0) {
|
|||
Write-Host "Services are up and healthy!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Applying migrations..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py migrate --no-input
|
||||
docker compose exec app uv run python manage.py migrate --no-input
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "Migrations applied successfully!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Collecting static files..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py collectstatic --clear --no-input
|
||||
docker compose exec app uv run python manage.py collectstatic --clear --no-input
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Write-Host "Static files collected successfully!" -ForegroundColor Green
|
||||
|
||||
Write-Host "Setting default caches..." -ForegroundColor Magenta
|
||||
docker compose exec app poetry run python manage.py set_default_caches
|
||||
docker compose exec app uv run python manage.py set_default_caches
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue